본문 바로가기

최대공약수와 최소공배수

programmers code review/_step1 2021. 8. 11.
728x90

프로그래머스 1단계 Java 최대공약수와 최소공배수 문제입니다.


문제 설명

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

 

제한 사항

  • 두 수는 1이상 1000000이하의 자연수입니다.

입출력 예

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

 

입출력 예 설명

입출력 예 #1
위의 설명과 같습니다.

입출력 예 #2
자연수 2와 5의 최대공약수는 1, 최소공배수는 10이므로 [1, 10]을 리턴해야 합니다.

 

문제 해결 방법

① 입력받은 두 수 중 작은 수를 첫번째 인덱스, 큰 수를 두번째 인덱스에 초기화

② 작은 수로 큰 수를 나누었을 때 나머지를 확인

    ⑴ 0일 경우 ▶ 각각 최소공배수, 최대공약수이므로 배열 반환

    ⑵ 0이 아닐 경우 ▶ 재귀함수 호출 - 작은 수를 첫번째 인자, 나눈 나머지 값을 두번째 인자

③ 나머지가 0이 되어 배열을 반환할 때까지 재귀(반환된 배열의 첫번째 인덱스 값이 최대공약수)

④ 다음의 공식을 이용하여 최소공배수를 계산

    ▶ 최소공배수 = (두 수의 곱) / 최대공약수


더보기
class Solution {
    public int[] solution(int n, int m) {
        // ① 입력받은 두 수 중 작은 수를 첫번째 인덱스, 큰 수를 두번째 인덱스에 초기화
        int[] answer = n < m ? new int[] { n, m } : new int[] { m, n };
        // ② 작은 수로 큰 수를 나누었을 때 나머지를 확인
        if (answer[1] % answer[0] == 0)
			// ⑴ 0일 경우 ▶ 각각 최소공배수, 최대공약수이므로 배열 반환
			return answer;
		else {
			// ⑵ 0이 아닐 경우 ▶ 재귀함수 호출 - 작은 수를 첫번째 인자, 나눈 나머지 값을 두번째 인자
			answer = solution(answer[0], answer[1] % answer[0]);
		}
		// ③ 나머지가 0이 되어 배열을 반환할 때까지 재귀(반환된 배열의 첫번째 인덱스 값이 최대공약수)
		
        // ④ 다음의 공식을 이용하여 최소공배수를 계산
        // ▶ 최소공배수 = (두 수의 곱) / 최대공약수
        answer[1] = n * m / answer[0];

		return answer;
    }
}

※ 삼항연산자

②③ 의 반환값은 삼항연산자로 값을 정하게 되는데, if/else 문과 매우 흡사하여 코드가 간결해지는데에 도움이 됩니다.

삼항연산자 사용법은 다음과 같으며, 참 또는 거짓의 값을 반드시 반환하는 것이 if/else 문과의 차이점입니다.

Condition ? TRUE : FALSE

if/else 문에 비해 구문이 간단하다해서 속도가 빠른 것은 아닙니다.

 

※ 유클리드 호제법

유클리드 호제법은 2개의 자연수의 최대공약수를 구하는 알고리즘의 하나입니다. 

이는 명시적으로 기술된 가장 오래된 알고리즘으로서도 알려져 있습니다.

최대공약수를 구하는 문제에 있어서 도움이 되므로 한번쯤은 짚고 넘어가시는걸 추천합니다.

 

유클리드 호제법 > https://ko.wikipedia.org/wiki/유클리드_호제법
 

유클리드 호제법 - 위키백과, 우리 모두의 백과사전

유클리드 호제법(-互除法, Euclidean algorithm) 또는 유클리드 알고리즘은 2개의 자연수 또는 정식(整式)의 최대공약수를 구하는 알고리즘의 하나이다. 호제법이란 말은 두 수가 서로(互) 상대방 수를

ko.wikipedia.org

 

※ 위 코드는 해결 방법 중 한가지이며 더 효율적인 코드가 있을 수 있습니다.

 

문제 풀어보기 ▶ https://programmers.co.kr/learn/courses/30/lessons/12940?language=java
 

코딩테스트 연습 - 최대공약수와 최소공배수

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

programmers.co.kr

 

'programmers code review > _step1' 카테고리의 다른 글

제일 작은 수 제거하기  (0) 2021.08.13
짝수와 홀수  (0) 2021.08.13
콜라츠 추측  (0) 2021.08.10
평균 구하기  (0) 2021.08.10
하샤드 수  (0) 2021.08.09

댓글