문제 해석
바로 전에 풀었던 문제와 똑같은 BFS를 돌릴 때 depth를 포함해 튜플 형태로 덱에 append시킨 후 탐색을 진행하는 문제였다.
문제 풀이
import sys
from collections import deque
N, K = map(int, sys.stdin.readline().split())
deq = deque()
cnt = 0
deq.append((N, cnt))
while deq:
N, cnt = deq.popleft()
if N != K:
deq.append((N - 1, cnt + 1))
deq.append((N + 1, cnt + 1))
deq.append((N * 2, cnt + 1))
else:
result = cnt
break
print(result)
우선 테스트 케이스가 하나 뿐이지만 직관적으로 떠오르는대로 짠 코드이다.
이렇게 해서 N이 K가 되었을 때의 depth값 cnt를 result에 할당해서 출력하면 도달할때까지 몇초가 걸렸는지를 알 수 있다.
하지만 메모리 초과가 났기 때문에 문제에서 원하는 조건과 그에 맞는 코드가 무엇인지를 찾아보았다.
import sys
from collections import deque
N, K = map(int, sys.stdin.readline().split())
max = 100000
visited = [0] * (max + 1)
deq = deque()
deq.append(N)
while deq:
x = deq.popleft()
if x == K:
print(visited[x])
break
for nx in (x - 1, x + 1, x * 2):
if 0 <= nx <= max and not visited[nx]:
visited[nx] = visited[x] + 1
deq.append(nx)
문제에서 주어진 변수의 범위에 맞게 코드를 짜거나 시간초과를 그다지 경험해본 적이 없어서 많이 당황했다.
우선 N의 범위가 100000 이기 때문에 max에 100000을 할당해주고 방문을 확인할 리스트 visited를 max+1의 길이로 선언했다.
그리고 덱에 새로 방문할 노드를 삽입하는 부분에서도 새로 방문할 노드가 0부터 max 사이의 숫자인지를 확인한 후에 덱에 append 시켰다.
단순히 모든 경우의 수를 다 덱에 삽입해서 탐색을 돌리는 문제가 아니라
조건에 맞는 경우의 수만 제한해서 탐색하게 조건을 거는 문제에도 익숙해져야 다른 문제를 풀때도 그런 부분까지 생각해보고 문제를 풀다 막혔을때 방법을 생각해낼 수 있을것 같다.
'BOJ' 카테고리의 다른 글
[BOJ] 1541 : 잃어버린 괄호 - 파이썬(Python) (0) | 2022.07.19 |
---|---|
[BOJ] 16953 : A → B - 파이썬(Python) (0) | 2022.07.16 |
[BOJ] 11724 : 연결 요소의 개수 - 파이썬(Python) (0) | 2022.07.14 |
[BOJ] 1182 : 부분수열의 합 - 파이썬(Python) (0) | 2022.07.14 |
[BOJ] 4963 : 섬의 개수 - 파이썬(Python) (0) | 2022.07.13 |