본문 바로가기
개발/알고리즘

[프로그래머스][LEVEL1] 최대공약수와 최소 공배수

by ISA(류) 2021. 8. 23.

# 문제 원문

 

두 수를 입력받아 두 수의 최대공약수와 최소공배수를 반환하는 함수, 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)];
            }
        }
    }, []);
}
반응형