100세까지 코딩
[프로그래머스] Lv0.유한소수 판별하기 본문
문제 설명
풀기 전 생각
- 저번에 풀었던 기약분수 만드는 방법을 활용, 최대공약수(gcd)를 구하기
- 5로 나눠 떨어질 때까지 나누기, 2로 나눠 떨어질 때까지 나누기
- 나누고 난 값이 1만 남으면 소인수는 2,5만 존재
- 1 이외의 값이 남아있으면 소인수는 2,5 외에도 있음
class Solution {
public int solution(int a, int b) {
int answer = 0;
b = b / gcd(a, b); //분모를 최대공약수로 나눠 기약분수형태의 분모로 바꿔줌
while ( b % 5 == 0) { // 5로 나눈 나머지가 0이면 5의 배수
b /= 5; // 5로 나눈 수를 b에 다시 대입
}
while (b % 2 == 0) { // 2로 나눈 나머지가 0이면 2의 배수
b /= 2; // 2로 나눈 수를 b에 다시 대입
}
if (b==1) { // b가 1이면 소인수가 2,5만 존재한다는 뜻
answer = 1;
} else { // b가 1이 아닌 다른 수면 소인수가 2,5외에도 있다는 뜻
answer = 2;
}
return answer;
}
public int gcd(int a,int b) { // 최대공약수 구하는 유클리드 호제법
while (b > 0) {
int temp = a % b;
a = b;
b = temp;
}
return a;
}
}
오류 및 개선
- 오류는 없지만 좀더 가독성 있는 코드를 발견!
최종
class Solution {
public int solution(int a, int b) {
int answer = 0;
b = b / gcd(a, b); //분모를 최대공약수로 나눠 기약분수형태의 분모로 바꿔줌
while(b!=1){ // 1이 아닐때까지 반복
if (b % 5 == 0) { // 5로 나눈 나머지가 0이면 5의 배수
b /= 5; // 5로 나눈 수를 b에 다시 대입
continue; // 다시 위에서 부터 반복문 시행
}
if (b % 2 == 0) { // 2로 나눈 나머지가 0이면 2의 배수
b /= 2; // 2로 나눈 수를 b에 다시 대입
continue; // 다시 위에서 부터 반복문 시행
}
return answer = 2; // 조건에 안걸리고 b가 1이 아니면 무한소수
}
return answer = 1; // b가 1이 되어 반복문 탈출했으면 유한소수
}
public int gcd(int a,int b) { // 최대공약수 구하는 유클리드 호제법
while (b > 0) {
int temp = a % b;
a = b;
b = temp;
}
return a;
}
}
참고
유클리드 호제법을 사용한 이전 풀이
'코딩테스트 > 자바' 카테고리의 다른 글
[프로그래머스] Lv0.정수를 나선형으로 배치하기 (0) | 2023.08.25 |
---|---|
[프로그래머스] Lv0.OX퀴즈 (0) | 2023.08.18 |
[프로그래머스] Lv0.최빈값 구하기 (0) | 2023.08.17 |
[프로그래머스] Lv0.문자열 밀기 (0) | 2023.08.16 |
[프로그래머스] Lv0.다항식 더하기 (0) | 2023.08.14 |