2024. 11. 22. 18:00ㆍ입문문제
https://school.programmers.co.kr/learn/courses/30/lessons/12940
프로그래머스
SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
문제 설명
두 수를 입력받아 두 수의 최대공약수와 최소공배수를 반환하는 함수, 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]을 리턴해야 합니다.
주어진 두 수의 최대공약수와 최소공배수를 구하는 문제입니다.
최소공배수는 공식이 간단합니다. 최소공배수 = (두 수의 곱) / (두 수의 최대공약수) 라는 건 널리 알려져 있죠.
따라서 우리는 최대공약수만 잘 구하면 쉽게 문제를 풀 수 있습니다.
파이썬의 경우에는 math 패키지에서 gcd와 lcm(3.9 이상부터 제공)을 제공하기 때문에 간단하게 최대공약수와 최소공배수를 구할 수 있습니다.
자바의 경우에는 직접 최대공약수를 구하는 함수를 작성해야 하는데요, 저는 유클리드 호제법을 사용해서 최대공약수를 구할 겁니다.
유클리드 호제법은 다음 원리를 기반으로 합니다.
1. 두 정수 n과 m이 있을 때, n을 m으로 나눈 나머지를 r이라고 하면, GCD(n, m) = GCD(m, r)이 성립합니다.
2. 즉, n을 m으로 나눈 나머지 r을 사용해 문제를 단순화하여, 더 작은 두 수의 GCD를 구하는 방식으로 문제를 반복적으로 축소할 수 있습니다.
3. 이 과정을 반복하다가 나머지가 0이 되면, 나눗셈을 수행한 수가 두 수의 최대공약수가 됩니다.
정답 코드를 작성해보겠습니다.
1. 자바
class Solution {
public int[] solution(int n, int m) {
// 최대공약수, 최소공배수를 저장할 answer 배열
int[] answer = new int[2];
// 최대공약수, 최소공배수를 구합니다.
int gcd = getGCD(n, m);
int lcm = (n * m) / gcd;
// 배열에 값을 추가합니다.
answer[0] = gcd;
answer[1] = lcm;
// 배열을 반환합니다.
return answer;
}
// 최대공약수를 구하는 함수
public int getGCD(int n, int m) {
// n이 m으로 나눠지면 m을 반환합니다.
if (n % m == 0)
return m;
// 나눠지지 않는다면 m과 n % m의 나머지로 반복합니다.
return getGCD(m, n % m);
}
}
2. 파이썬
# 최대공약수를 구하기 위한 gcd
from math import gcd
def solution(n, m):
# 최소공배수를 구하기 위한 lcm 구현
def lcm(n, m):
# 최소공배수 = 두 수의 곱 / 두 수의 최대공약수
return n * m // gcd(n, m)
# answer에 최대공약수, 최소공배수 설정
answer = [gcd(n, m), lcm(n, m)]
# answer 반환
return answer
이 문제를 풀면서 유클리드 호제법이라는 걸 알게 되었습니다.
이런 수학적인 건 정말 알지 못하면 못 푸는 것 같네요.
'입문문제' 카테고리의 다른 글
| [연습문제] 평균 구하기 (0) | 2024.11.27 |
|---|---|
| [연습문제] 콜라츠 추측 (0) | 2024.11.24 |
| [연습문제] 짝수와 홀수 (0) | 2024.11.21 |
| [연습문제] 제일 작은 수 제거하기 (1) | 2024.11.20 |
| [연습문제] 정수 제곱근 판별 (0) | 2024.11.18 |