
내가 생각했을때 문제에서 원하는부분
소수점 아래 숫자가 계속되지 않고 유한개인 소수를 유한소수라고 합니다.
분수를 소수로 고칠 때 유한소수로 나타낼 수 있는 분수인지 판별하려고 합니다.
유한소수가 되기 위한 분수의 조건은 다음과 같습니다.
기약분수로 나타내었을 때, 분모의 소인수가 2와 5만 존재해야 합니다.
두 정수 a와 b가 매개변수로 주어질 때, a/b가 유한소수이면 1을, 무한소수라면 2를 return하도록 solution 함수를 완성해주세요.
내가 이 문제를 보고 생각해본 부분
최대공약수 구하기 및 약분
getGcd(a, b) 메서드를 호출하여 분자 a와 분모 b의 최대공약수를 구한다.
분모 b를 최대공약수로 나누어 기약분수의 분모 형태로 만든다.
분모에서 2와 5 제거하기
첫 번째 while 반복문은 분모 b가 2로 나누어떨어지는 동안 계속 2로 나눈다.
두 번째 while 반복문은 분모 b가 5로 나누어떨어지는 동안 계속 5로 나눈다.
최종 결과 판별하기
2와 5를 모두 나눈 뒤 남은 분모 b의 값이 1인지 확인한다.
분모가 1이라면 유한소수이므로 1을 반환하고, 1이 아니라면 무한소수이므로 2를 반환한다.
getGcd 메서드는 유클리드 호제법 알고리즘을 사용하여 두 수의 최대공약수를 재귀적으로 구한다.
코드로 구현
class Solution {
public int solution(int a, int b) {
int gcd = getGcd(a, b);
b = b / gcd;
while (b % 2 == 0) {
b /= 2;
}
while (b % 5 == 0) {
b /= 5;
}
if (b == 1) {
return 1;
} else {
return 2;
}
}
private int getGcd(int x, int y) {
if (y == 0) {
return x;
}
return getGcd(y, x % y);
}
}
프로그래머스 코드
package programmers.programmers2;
// 프로그래머스 유한소수 판별하기
public class Main151 {
public static void main(String[] args) {
Solution6 sol = new Solution6();
System.out.println(sol.solution(7, 20)); // 1
System.out.println(sol.solution(11, 22)); // 1
System.out.println(sol.solution(12, 21)); // 2
}
}
class Solution6 {
public int solution(int a, int b) {
int gcd = getGcd(a, b);
b = b / gcd;
while (b % 2 == 0) {
b /= 2;
}
while (b % 5 == 0) {
b /= 5;
}
if (b == 1) {
return 1;
} else {
return 2;
}
}
private int getGcd(int x, int y) {
if (y == 0) {
return x;
}
return getGcd(y, x % y);
}
}
위에 있는 코드를 변경한 코드
코드와 설명이 부족할수 있습니다. 코드를 보시고 문제가 있거나 코드 개선이 필요한 부분이 있다면 댓글로 말해주시면 감사한 마음으로 참고해 코드를 수정 하겠습니다.