문제
27440번: 1로 만들기 3
첫째 줄에 1보다 크거나 같고, 1018보다 작거나 같은 정수 N이 주어진다.
www.acmicpc.net
코드
from collections import deque
def bfs(n):
q = deque([(n, 0)])
visited = set([n])
while q:
cur, count = q.popleft()
if cur == 1:
return count
if cur % 3 == 0 and (cur // 3) not in visited:
q.append((cur // 3, count + 1))
visited.add(cur // 3)
if cur % 2 == 0 and (cur // 2) not in visited:
q.append((cur // 2, count + 1))
visited.add(cur // 2)
if (cur - 1) not in visited:
q.append((cur - 1, count + 1))
visited.add(cur - 1)
return -1
n=int(input())
print(bfs(n))
풀이
- n을 입력받는다.
- 입력받은 n을 bfs함수에 넣고 돌려준다. 문제에서 주어진 조건을 만족하면 q에 넣는다.
- X가 3으로 나누어 떨어지면, 3으로 나눈다.
- X가 2로 나누어 떨어지면, 2로 나눈다.
- 1을 뺀다.
- 단 n의 크기가 최대 10^18로 엄청 크다. 그러므로 최대한 중복된 값을 탐색하지 않기 위해서 visited라는 set()을 선언한다.
- 매번 얻는 값들을 visited에 넣어주고, bfs 시행 시 조건을 만족해도 visited에 있는 수들은 q에 넣지 않는다.(중복을 피한다)
- 1이 되면 횟수를 return한다.
'알고리즘' 카테고리의 다른 글
[백준] 2096 내려가기 python (0) | 2024.03.19 |
---|---|
[백준] 9456 스티커 python (2) | 2024.03.18 |
[백준] 15663 N과M (9) python (0) | 2024.03.18 |
[프로그래머스] 여행경로 python (2) | 2024.03.12 |
[백준] 1063 킹 python (4) | 2024.03.06 |