✔ 풀이를 위한 아이디어
✔ 수정 전 코드 1 [메모리 초과]
import sys
from collections import deque
N, K = map(int, sys.stdin.readline().split())
queue = deque([])
if N == K:
print('0')
sys.exit()
queue.append(N+1)
if N - 1 >= 0:
queue.append(N-1)
queue.append(2*N)
count = 0
while queue:
ln = len(queue)
count += 1
for _ in range(ln):
tmp = queue.popleft()
if tmp == K:
print(count)
sys.exit()
queue.append(tmp+1)
if tmp - 1 >= 0:
queue.append(tmp-1)
queue.append(2*tmp)
✔ 수정 전 코드 [시간 초과]
import sys
from collections import deque
N, K = map(int, sys.stdin.readline().split())
queue = deque([])
if N == K:
print('0')
sys.exit()
visited = []
if N + 1 <= 100000:
queue.append(N+1)
visited.append(N+1)
if N - 1 >= 0:
queue.append(N-1)
visited.append(N-1)
if 2*N <= 100000:
queue.append(2*N)
visited.append(2*N)
count = 0
while queue:
ln = len(queue)
count += 1
for _ in range(ln):
tmp = queue.popleft()
if tmp == K:
print(count)
sys.exit()
if tmp + 1 <= 100000 and tmp + 1 not in visited:
queue.append(tmp+1)
visited.append(tmp+1)
if tmp - 1 >= 0 and tmp - 1 not in visited:
queue.append(tmp-1)
visited.append(tmp-1)
if 2*tmp <= 100000 and 2*tmp not in visited:
queue.append(2*tmp)
visited.append(2*tmp)
✔ 수정 후 코드
import sys
from collections import deque
N, K = map(int, sys.stdin.readline().split())
MAX = 10 ** 5
dist = [0] * (MAX+1)
queue = deque([N])
while queue:
x = queue.popleft()
if x == K:
print(dist[x])
break
for nx in (x-1, x+1, 2*x): #위처럼 if문으로 나누기보다, for문을 이렇게 활용하면 코드가 깔끔하다.
if 0<= nx <= MAX and not dist[nx]:
dist[nx] = dist[x] + 1 # Dynamic Programming의 처리와 유사하다.
queue.append(nx)
이 문제를 통해 배운 점들을 앞으로의 풀이에 꼭 적용하자!
✔ 관련 개념