int 타입 변수 n과 m을 입력받아 두 수의 최대공약수와 최소공배수를 구하여 배열로 반환하는 문제이다. 코드를 보며 확인해보도록 하겠다.
최대공약수와 최소공배수가 무엇인지에 대해서는 간단하게만 설명하겠다. 우선, 최대공약수는 임의의 두 수를 동시에 나누어 떨어지게 하도록 하는 숫자 중 가장 큰 수를 두 수의 최대공약수라 하고, 최소공배수는 두 수의 곱을 최대공약수로 나눈 것을 두 수의 최소공배수라고 한다. 다음은 코드를 보면서 설명하도록 하겠다.
어느 두 수의 최대공약수와 최소공배수를 구할 때 두 수를 동시에 나누어서 딱 떨어지는 숫자가 1을 제외하고 존재하지 않으면 두 수의 최대공약수는 1이 되고, 이때 최소공배수는 두 수의 곱이 된다. 하나의 예로 두 수 7과 11은 두 수를 동시에 나누어 떨어지게 하는 숫자가 없기 때문에 최대공약수는 1, 최소공배수는 두 수의 곱인 77이 된다. 만약 1을 제외하고 두 수를 동시에 나누어 떨어지게 하는 수가 있다면 그 숫자가 바로 최대공약수가 될 것이다. 6 ~ 10번째 줄의 코드들이 최대공약수와 최소공배수를 구하는 코드들이다. 1부터 n까지 반복하는 for 반복문인데, 입력받은 n과 m에 저장된 값들 중 어느 것이 더 크고 작은 지는 알 수는 있지만 범위를 더 작은 값으로 하던 큰 값으로 하던 전혀 상관은 없다. 어차피 두 수를 동시에 나누어 떨어지게 하는 숫자 중 제일 큰 숫자가 최대공약수가 되는 것인데, 6과 14의 최대공약수와 최소공배수를 구한다고 할 때 최대공약수가 두 수 중 작은 값인 6을 넘어설 수는 없다. 이 때문에 범위가 6까지이던 14까지이던 상관이 없는 것이다. 이렇게 최대공약수를 구하면 문제에서 요구하는 배열 answer의 0번 인덱스에 최대공약수를 저장하고 최소공배수는 두 수의 곱을 최대공약수로 나누어 저장하면 된다. 만약 if 조건문을 충족하는 것이 아무것도 없다면 최대공약수는 1, 최소공배수는 두 수의 곱이 되는 것이다.
========== 느낀 점 ==========
최대공약수와 최소공배수는 정말 어릴 적 수학 시간에 배웠던 개념이었다. 그냥 계산을 할 때에는 별생각 없이 구할 수 있던 것들이었는데 코드로 작성하려고 하니 이 둘이 어떤 논리로 되어있는지에 대해 생각을 하게 되었다. 수학 연산들을 코드로 작성하다 보면 풀이법은 바로 생각이 나더라도 그걸 코드로 실행하는 것이 어려울 때가 종종 있다. 그럴 때에는, 그 결과가 어떻게 나오는지에 대한 원리에 대해 생각을 하면 해결책이 나오는 것 같다. 이번 문제를 풀고 나서 다른 사람들의 풀이들 중 나와 다른 풀이를 찾아보면서 내가 생각한 풀이 말고도 최대공약수와 최소공배수를 다양하게 풀어내고 있다는 것을 확인하였다. 어떤 것이 좋은 코드인지에 대한 정답은 없지만 효율성이 좋은 코드를 짜기 위해 열심히 코딩을 해야겠다.
파이팅!!
'알고리즘' 카테고리의 다른 글
프로그래머스 - 부족한 금액 계산하기 (0) | 2022.02.15 |
---|---|
프로그래머스 - 이상한 문자 만들기 (0) | 2022.02.14 |
프로그래머스 - 두 정수 사이의 합 (0) | 2022.02.10 |
프로그래머스 - 제일 작은 수 제거하기 (0) | 2022.02.09 |
프로그래머스 - 문자열 내 p와 y의 개수 (0) | 2022.02.08 |