본문 바로가기
Algorithm

[Programmers] Lv. 1 최대공약수와 최소공배수

by Jamie Lim 2022. 9. 10.

문제 설명

두 수를 입력받아 두 수의 최대공약수와 최소공배수를 반환하는 함수, solution을 완성해 보세요. 배열의 맨 앞에 최대공약수, 그다음 최소공배수를 넣어 반환하면 됩니다. 예를 들어 두 수 3, 12의 최대공약수는 3, 최소공배수는 12이므로 solution(3, 12)는 [3, 12]를 반환해야 합니다.

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

입출력 예시

m return
3 12 [3, 12]
2 5 [1, 10]

 

풀이 코드

Java

class Solution {
    public int[] solution(int n, int m) {
        int[] answer = new int[2];
        
        int multiply = n * m;
        
        if (n < m) {
            int tmp = n;
            n = m;
            m = tmp;
        }
        
        int c;
        while (m != 0) {
            c = n % m;
            
            n = m;
            m = c;
        }
        
        answer[0] = n;
        answer[1] = multiply / n;
        
        return answer;
    }
}

 

Python

def solution(n, m):
    answer = []
    
    multiple = n*m    
    
    if n < m :
        tmp = n
        n = m
        m = tmp
        
    while m != 0:
        c = n % m
        n = m
        m = c
    
    answer.append(n)
    answer.append(multiple / n)
    
    return answer

 

풀이

1. 최대공약수

유클리드 호제법 사용하기

유클리드 호제법이란?
A와 B라는 값의 최대 공약수를 구하고 싶다 가정 (단, A > B)
이때, A = B * Q + R이다.

최대 공약수를 G라고 하였을 때 아래와 같이 수식을 나타낼 수 있다. (a * G == A, b * G == B) a * G = b * G * Q + R

위 수식을 R의 입장으로 정리해보자 R = G * (a - b * Q)

즉, R도 최대 공약수 G를 약수로 갖게 되니 B와 R의 최대 공약수와 A와 B의 최대 공약수는 동일하다.

 

  • 간단 정리
    • 큰 수를 작은 수로 나눈다
    • 나누는 수를 나머지로 계속 나눈다.
    • 나머지가 0이 나오면 나누는 수가 최대 공약수이다.

 

2. 최소공배수

최소공배수는 A*B / (최대공약수) 이다

 

참고 사항

Java의 배열은 원래 {}로 초기화 되어 있었지만, new int[2]로 수정하여 풀었다.

 

참고 자료
https://kangworld.tistory.com/184

 

'Algorithm' 카테고리의 다른 글

[Programmers] Lv.2 프린터  (0) 2023.02.06
[Programmers] Lv. 2 n^2 배열 자르기  (0) 2023.02.05
[Programmers] Lv. 1 짝수와 홀수  (0) 2022.09.10
[Algorithm] 배열 채우기  (0) 2020.12.02
[Algorithm] 진수 변환  (0) 2020.11.18

댓글