문제링크
풀이
- 처음에는 큐에 route라는 배열도 함께 넣어줘서 위치 이동할 때마다 route 배열에 경로 추가해주는 방식으로 구현하였는데
메모리 초과 발생
내가 구현한 것처럼 경로를 모두 다 기록하게 되면 O(n^2)의 메모리가 필요하게 되어 메모리 초과가 발생한다고 한다.
따라서 모든 경로는 저장하는 것이 아니라, 자취를 남기는 식으로 구현해야했다.
path 배열에 자취를 남겼는데
path[a] = b 는 b에서 a로 왔음을 의미한다.
따라서 k에 도착했을 때 path배열을 거꾸로 읽어가면 경로를 알 수 있게 된다.
from collections import deque
import sys
input = sys.stdin.readline
def bfs(n,k):
q = deque()
# 방문표시
visited = [False] * 100001
visited[n] = True
# 자취를 저장할 배열
path =[0] * 100001
# 출발지 표시
path[n] = n
# 위치, 이동 횟수
q.append((n,0))
while q:
now, cnt = q.popleft()
# k에 도착했다면
if now == k :
print(cnt)
# 경로를 기록할 배열
answer = []
x = now
answer.append(x)
# 출발지에 도착하기 전까지
while path[x] != x :
# 경로 읽기
answer.append(path[x])
x = path[x]
# 거꾸로 저장되어있으므로
answer.reverse()
# 출력
print(*answer)
return answer
# 범위에 속하고 방문하지 않았으면
if now + 1 < 100001 and not visited[now+1] :
#자취 표시
path[now+1] = now
# 큐에 삽입
q.append((now+1, cnt +1 ))
# 방문 표시
visited[now+1] = True
# 범위에 속하고 방문하지 않았으면
if 0 <= now - 1 < 100001 and not visited[now-1]:
path[now-1] = now
q.append((now-1, cnt +1))
visited[now-1] = True
# 범위에 속하고 방문하지 않았으면
if now * 2 < 100001 and not visited[now*2] :
path[now*2] = now
q.append((now*2, cnt +1))
visited[now*2] = True
return -1
n, k = map(int,input().split())
bfs(n,k)
'개발 > algorithm' 카테고리의 다른 글
[프로그래머스][level3] 아이템 줍기 - python (0) | 2022.06.25 |
---|---|
[백준 17086번] 아기 상어2 - python (0) | 2022.06.19 |
[백준 2023번] 신기한 소수 - python (0) | 2022.06.12 |
[백준 1005번] ACM Craft - python (0) | 2022.06.12 |
[백준 9470번] Strahler 순서 - python (0) | 2022.06.12 |