🔗 1. 문제 URL
https://school.programmers.co.kr/learn/courses/30/lessons/120878
프로그래머스
SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
📝 2. 문제 요구사항 정리
두 정수 a와 b가 주어졌을 때, 분수 a / b가 유한소수로 표현될 수 있는지 판별하는 문제입니다. 유한소수라면 1을, 무한소수라면 2를 반환해야 합니다.
- 핵심 조건: 기약분수로 만들었을 때 분모의 소인수가 2와 5만 남아야 유한소수입니다.
- 약분 처리: a와 b의 최대공약수로 b를 나누어 기약분수의 분모를 구합니다.
- 반환값: 분모에서 2와 5를 모두 제거한 뒤 1이 남으면 1, 다른 값이 남으면 2를 반환합니다.
💡 3. 핵심 개념
✔ 1) 최대공약수로 기약분수 만들기
유한소수 여부는 원래 분모가 아니라 기약분수로 바꾼 뒤의 분모를 기준으로 판단해야 합니다. 따라서 math.gcd(a, b)를 이용해 a와 b의 최대공약수를 구하고, b를 그 값으로 나누어 약분된 분모 n을 만듭니다.
✔ 2) 유한소수의 분모 조건 이해하기
어떤 분수가 유한소수가 되려면 기약분수의 분모가 2와 5만을 소인수로 가져야 합니다. 10이 2 × 5로 이루어져 있기 때문에, 분모를 10의 거듭제곱 형태로 만들 수 있는 경우에만 소수점 아래가 유한하게 끝납니다.
✔ 3) 2와 5를 반복해서 제거하기
약분된 분모 n에서 2로 나누어떨어지는 동안 계속 2를 제거하고, 5로 나누어떨어지는 동안 계속 5를 제거합니다. 이 과정을 마친 뒤 n이 1이면 2와 5 외의 소인수가 없다는 뜻이므로 유한소수입니다.
✅ 4. 정답 Python 코드
import math
def solution(a, b):
## 유한소수면 1, 아니면 2
gcd_num = math.gcd(a, b)
n = b // gcd_num
while n % 2 == 0:
n //= 2
while n % 5 == 0:
n //= 5
return 1 if n ==1 else 2
💬 5. 풀이하면서 느낀 점
처음에는 분모에 2와 5만 있는지 확인하면 된다고 단순하게 생각할 수 있는데, 풀이를 정리하다 보니 먼저 기약분수로 약분하는 과정이 핵심이라는 점을 떠올릴 수 있었습니다. 분모가 처음에는 복잡해 보여도 약분하고 나면 유한소수 조건을 만족할 수 있기 때문입니다.
그래서 최대공약수로 분모를 줄인 뒤, 남은 분모에서 2와 5를 하나씩 걷어내는 방식으로 풀었습니다. 수학 개념을 코드로 옮기는 문제라서 어렵지는 않았지만, 조건을 확인하는 순서를 놓치면 틀리기 쉬운 문제라고 느꼈습니다.
또한, math.gcd() 함수를 이용하는게 아닌, 유클리드 호제법으로도 풀이가 가능하다는 점을
궁금하신 점이나 포스팅에 대한 피드백이 있다면 댓글로 편하게 남겨주세요.
도움이 되셨다면 공감이나 댓글 한 줄 남겨주시면 포스팅을 이어가는 데 큰 힘이 됩니다. 😊
'코딩테스트 > 알고리즘' 카테고리의 다른 글
| [프로그래머스 LV.0] 문자열 밀기 — Python 정답 & 해설 (0) | 2026.06.19 |
|---|---|
| [프로그래머스 LV.2] 괄호 회전하기 — Python 정답 & 해설 (0) | 2026.06.16 |
| [프로그래머스 LV.0] 배열 만들기 2 — Python 정답 & 해설 (0) | 2026.06.11 |
| [프로그래머스 LV.0] 배열 조각하기 — Python 정답 & 해설 (0) | 2026.06.11 |
| [프로그래머스 LV.2] 행렬의 곱셈 — Python 정답 & 해설 (0) | 2026.05.22 |