알고리즘 풀이 방법입니다.
문제(Problem) -> 생각(Think) -> 해결책(Solution) -> 리뷰(Review) 를 통해서 정리해서 작성합니다.
Problem📄
https://programmers.co.kr/learn/courses/30/lessons/12940
코딩테스트 연습 - 최대공약수와 최소공배수
두 수를 입력받아 두 수의 최대공약수와 최소공배수를 반환하는 함수, solution을 완성해 보세요. 배열의 맨 앞에 최대공약수, 그다음 최소공배수를 넣어 반환하면 됩니다. 예를 들어 두 수 3, 12의
programmers.co.kr
Think🤔
두 개의 파라미터 값을 받아서 정수형 배열로 최대공약수와 최소공배수를 return하는 문제이다.
최대 공약수는 더 낮은 값에서 둘다 나뉘어 1부터 비교해서 나눠 떨어지면 최대 공약수가 나온다.
최소 공배수가 좀 어렵다..
구하는 방법은 아는데 막상 알고리즘으로 풀려고 하니 생각이 안난다... 흠....
구하는 방법을 식으로 적어보니
둘을 동시에 나누면서 그 값이 이제 동시에 나눠지지 않을때 각각 값이 남는데 그 값을 "서로소"라고 하고 그 서로소 두개를 곱해주면 최소 공배수가 된다.
그럼 이제 동시에 나누는 방법을 적용한다.
생각해보면 이미 서로소를 구하는 방법은 쉽다. 아까 구했던 최대 공약수로 각각 n과 m값을 나눠주면 서로소 값이 나온다.
Solution✍
class Solution {
public int[] solution(int n, int m) {
int[] answer = new int[2];
// 둘 중 더 작은거까지 조사
int small = Math.min(n,m);
//최대공약수
for(int i=1; i<=small; i++){
if(n%i == 0 && m%i == 0){
answer[0] = i;
}
}
//최소공배수
n = n/answer[0];
m = m/answer[0];
answer[1] = n * m * answer[0];
return answer;
}
}
마지막 최소 공배수를 구한 부분을 살짝 줄여보자면
class Solution {
public int[] solution(int n, int m) {
int[] answer = new int[2];
// 둘 중 더 작은거까지 조사
int small = Math.min(n,m);
//최대공약수
for(int i=1; i<=small; i++){
if(n%i == 0 && m%i == 0){
answer[0] = i;
}
}
answer[1] = (n * m) / answer[0];
return answer;
}
}
Review🤩
재귀 함수적으로 짜는 코드법을 보았다.
static을 이용해서 새 메서드를 만들어서 재귀적으로 짜는 방법.. (다른 사람 코드)
class Solution {
public int[] solution(int n, int m) {
int[] answer = new int[2];
answer[0] = gcd(n,m);
answer[1] = (n*m)/answer[0];
return answer;
}
public static int gcd(int p, int q){
if (q==0) return p;
return gcd(q, p%q);
}
}
wow..
첫 번째 answer[0]에 최대 공약수를 넣어주는데 gcd라는 메서드를 먼저 생성한다.
p%q로 3을 12로 나눈 나머지는 0이 돼서 다시 gcd를 타는데 그러면 if 조건에 걸려서 3을 반환시킨다..
'Algorithm' 카테고리의 다른 글
[프로그래머스] 문자열 내림차순으로 배치하기 (0) | 2021.12.03 |
---|---|
[프로그래머스] 수박수박수박수박수박수? (0) | 2021.12.03 |
[프로그래머스] 정수 제곱근 판별 (0) | 2021.12.03 |
[프로그래머스] 콜라츠 추측 (0) | 2021.12.02 |
[프로그래머스] 짝수와 홀수 (0) | 2021.12.02 |