https://programmers.co.kr/learn/courses/30/lessons/12940
코딩테스트 연습 - 최대공약수와 최소공배수
두 수를 입력받아 두 수의 최대공약수와 최소공배수를 반환하는 함수, solution을 완성해 보세요. 배열의 맨 앞에 최대공약수, 그다음 최소공배수를 넣어 반환하면 됩니다. 예를 들어 두 수 3, 12의
programmers.co.kr
파이썬에도 풀어봤던 최대공약수, 최소공배수 문제인데, 유클리드의 호제법이 기억나지 않아 삽질하다가 결국 유클리드호제법을 찾아보고 풀었습니다. 기존 문제 풀이기법(1이 나올때까지 2부터 나눠서 나눠지면 그 수를 저장하는 방식)에 비해 용량이 3분의 2수준으로 줄었고 시간도 단축되서, 이 방식으로 푸는 게 맞다는 것을 깨달았습니다.
// 내가 푼 풀이
package programmers;
public class 최대공약수와최소공배수 {
public static void main(String[] args) {
System.out.println(solution(2, 5)[0]+","+solution(2, 5)[1]);
}
public static int[] solution(int n, int m) {
int max;// 큰 수 저장
int min;// 작은 수 저장
int remain;// 나머지 저장용
int[] answer = new int[2];
// 큰수, 작은 수 구분
if(n>=m){
max = n;
min = m;
}
else{
max = m;
min = n;
}
//큰수가 작은 수의 배수면 바로 return
if(max % min ==0){
answer[0] = min;
answer[1] = max;
}
// 아닐경우 유클리드호제법 사용
// a와 b의 최대공약수는 b와 a%b의 최대 공약수와 같다. a%b가 0이면 끝난것
else{
while(max%min!=0) {
remain = max%min;
max = min;
min = remain;
}
answer[0] = min;
answer[1] = n*m/min;
}
return answer;
}
}
// 다른 사람이 푼 풀이
import java.util.Arrays;
class TryHelloWorld {
public int[] gcdlcm(int a, int b) {
int[] answer = new int[2];
answer[0] = gcd(a,b);
answer[1] = (a*b)/answer[0];
return answer;
}
public static int gcd(int p, int q)
{
if (q == 0) return p;
return gcd(q, p%q);
}
// 아래는 테스트로 출력해 보기 위한 코드입니다.
public static void main(String[] args) {
TryHelloWorld c = new TryHelloWorld();
System.out.println(Arrays.toString(c.gcdlcm(3, 12)));
}
}
- 추천을 많이 받은 사람의 코드와 내 코드가 다른 점
- 유클리드 호제법을 함수로 구현
- 출력을 Arrays.toString(배열)로 설정: 배열내의 전체 요소의 정보 출력
아직도 부족함을 느끼는 부분은 기능을 함수화하는 것이 습관화되어있지 않다는 점입니다.
코드의 가독성을 위해서도 얼른 습관을 들여야겠다는 각오를 다시 한번 다져봅니다.
'개발 > 프로그래머스' 카테고리의 다른 글
정수 제곱근 판별 (0) | 2021.09.11 |
---|---|
제일 작은 수 제거하기 (0) | 2021.08.19 |
하샤드 수 (0) | 2021.08.16 |
콜라츠 추측 (0) | 2021.08.16 |
x만큼 간격이 있는 n개의 숫자 (0) | 2021.08.16 |