# 문제 원문
두 수를 입력받아 두 수의 최대공약수와 최소공배수를 반환하는 함수, solution을 완성해 보세요. 배열의 맨 앞에 최대공약수, 그다음 최소공배수를 넣어 반환하면 됩니다. 예를 들어 두 수 3, 12의 최대공약수는 3, 최소공배수는 12이므로 solution(3, 12)는 [3, 12]를 반환해야 합니다.제한 사항
- 두 수는 1이상 1000000이하의 자연수입니다.
입출력 예
n / m / return
3 | 12 | [3, 12] |
2 | 5 | [1, 10] |
# 문제 풀이
입력 받은 양의 정수 n, m의 최대 공약수와 최소 공배수를 구해서 반환 하는 문제이다. 최대 공약수, 최소 공배수 개념이 흐릿해져서 조금 시간을 낭비했다. 최대 공약수를 구하는건 간단히 가장 큰 m과 n의 약수를 찾으면 그게 최대 공약수다.
구하는 법은 입력 받은 n과 m 둘 중 작은 수 기준으로 1씩 빼가면서 반복해서 두 수 모두를 나눈후 나머지가 0이 되는 수를 찾으면 된다. 최소 공배수의 경우 처음에는 n * m 하면 끝나는 걸로 잘못 생각해서(기억이 문제다.. 어렴풋이 공식이 있다는 것만 기억나니까) 에러가 났었는데 최소 공배수의 경우 n * m / 최대 공약 수를 하면 바로 나온다. 최대 공약수만 구하면 나머지도 구해진다는 것. 이것도 사실 그냥 수학 문제 인 것 같다. for문 보다 효율적인 방법은 안떠오르는데 뭔가 FP스럽게 풀고 싶어서 reduce를 사용해서 for문을 맵핑했다. (n * m = 최대 공약수 * 최소 공배수)
# 솔루션 플로우
1. 입력 받은 양의 정수 n, m 중 작은 수를 구한다.
2. 작은 수 기준으로 1씩 빼면서 반복하여서 n, 과 m을 나누어서 나머지가 0 이 되는 최대 공약수를 구한다.
3. 구해진 최대 공약수 와 최소 공배수(n * m / 최대 공배수)를 최대 최소 순서로 담아서 result[] 구해준다.
4. 구해진 result[]배열을 반환한다.
1. FP
function solution(n, m) {
return [true].reduce((result, _) => {
for (let int = Math.min(n, m); int > 0; int--) {
if (n % int === 0 && m % int === 0) {
return [int, (n * m / int)];
}
}
}, []);
}
'개발 > 알고리즘' 카테고리의 다른 글
[프로그래머스][LEVEL1] [1차] 비밀지도 (0) | 2021.08.23 |
---|---|
[프로그래머스][LEVEL1] 직업군 추천하기 (0) | 2021.08.23 |
[프로그래머스][LEVEL1] 행렬의 덧셈 (0) | 2021.08.21 |
[프로그래머스][LEVEL1] 시저암호 (0) | 2021.08.21 |
[프로그래머스][LEVEL1] 문자열 내 p와 y의 개수 (0) | 2021.08.20 |