난이도 : ●◐○ | 풀이 시간 : 30분 | 시간 제한 : 1초 | 메모리 제한 : 128MB | 기출 : Google 인터뷰
문제
- 2, 3, 5만을 소인수로 가지는 수를 못생긴 수라고 한다.
- n번째 못생긴 수를 찾는 프로그램을 작성하라.
입력조건
- 첫째 줄에 n이 입력된다.(1<=n<=2,000)
출력조건
- n번째 못생긴 수를 출력한다.
입력예시
10
출력예시
4
아이디어
- 못생긴 수를 저장할 집합 s를 생성한다.
- 집합 s에 첫 번째 못생긴 수인 1을 추가한다.
- x를 첫 번째 못생긴 수인 1로 초기화한다.
- while문을 돌면서 x*2, x*3, x*5한 것이 s에 없다면 추가한다.
- 집합 s의 원소 개수가 n이 되면 반복을 종료한다.
- s에 마지막으로 추가된 수를 출력한다.
오답코드
n = int(input())
s = set()
s.add(1)
x = 1
flag = False
while True:
for i in (x*2,x*3,x*5):
if i not in s:
s.add(i)
if len(s)==n:
flag = True
break
if flag:
break
x += 1
print(list(s)[-1])
- 집합의 길이가 n이 되었을 때 집합에 n번째로 추가된 수가 항상 n번째 못생긴 수라는 보장이 없기 때문에 틀렸다.
- x*2, x*3, x*5 중에 가장 작은 값으로 다시 *2, *3, *5를 해야 바르게 n번째 못생긴 수를 구할 수 있다는 것을 깨달았다.
정답코드
n = int(input())
# n개의 못생긴 수를 저장할 리스트
ugly = [0]*n
# 첫 번째 못생긴 수는 1
ugly[0] = 1
# 2배, 3배, 5배를 위한 인덱스
i2=i3=i5=0
# 첫 번째 못생긴 수 1의 2배, 3배, 5배한 값으로 초기화
next2,next3,next5=2,3,5
for i in range(1,n):
# 2, 3, 5를 곱한 것 중 가장 작은 수를 선택함
ugly[i] = min(next2,next3,next5)
if ugly[i]==next2:
i2+=1
next2 = ugly[i2]*2
if ugly[i]==next3:
i3+=1
next3=ugly[i3]*3
if ugly[i]==next5:
i5+=1
next5=ugly[i5]*5
print(ugly[n-1])
후기
- i2, i3, i5를 활용하는 방법이 인상적이었다.
출처
이것이 취업을 위한 코딩테스트다 with 파이썬
'Algorithm > [이코테] 알고리즘 유형별 기출문제' 카테고리의 다른 글
[이코테] 다이나믹 프로그래밍 문제 - 퇴사 python (0) | 2023.11.24 |
---|---|
[이코테] 다이나믹 프로그래밍 - 정수 삼각형 python (1) | 2023.11.24 |
[이코테] DFS/BFS 구현문제 - 인구 이동 python (0) | 2023.11.17 |
[이코테] 정렬 문제 - 실패율 python (0) | 2023.11.05 |
[이코테] 정렬 문제 - 안테나 python (0) | 2023.11.05 |