티스토리 뷰

문제

https://www.acmicpc.net/problem/13913

 

13913번: 숨바꼭질 4

수빈이는 동생과 숨바꼭질을 하고 있다. 수빈이는 현재 점 N(0 ≤ N ≤ 100,000)에 있고, 동생은 점 K(0 ≤ K ≤ 100,000)에 있다. 수빈이는 걷거나 순간이동을 할 수 있다. 만약, 수빈이의 위치가 X일

www.acmicpc.net

내 답안

# 13913 숨바꼭질4
from collections import deque

n, k = map(int, input().split())
visited = [[0, -1] for _ in range(100001)]
visited[n][0] = 1
d = deque([n])

while d:
  cur = d.popleft()
  if cur == k:
    print(visited[cur][0] - 1)  # 시간 출력
    break

  for i in range(3):
    if i == 0:
      next = cur + 1
    elif i == 1:
      next = cur - 1
    else:
      next = cur * 2

    if 0 <= next < 100001 and visited[next][0] == 0:
      visited[next][0] = visited[cur][0] + 1
      visited[next][1] = cur
      d.append(next)

# 이동 경로 출력
cur = k
revAns = [k]  # 경로 저장 배열
while True:
  cur = visited[cur][1]
  if cur == -1:
    break
  else:
    revAns.append(cur)

print(*revAns[::-1])

해설

숨바꼭질 문제 시리즈를 풀어봤다면 쉽게 해결 할 수 있는 문제였다.

 

다만 지나온 경로를 저장해야 한다는 점이 다른 문제와의 차이점인데,

이는 visited 배열카운트직전 위치 정보를 저장하면 쉽게 해결할 수 있다.

 

목적지에 도착하면 카운트만 먼저 출력하고, 직전 위치에서 출발해서 시작점까지 백트래킹 하듯 이동 경로를 되짚어가면 된다.

 

피드백

  • 처음 풀이에서는 visited[][1]에 지나온 모든 경로를 저장했는데 메모리 초과 오류가 떴다. 모든 경로를 저장하지 않고 직전 위치만 저장함으로써 오류를 해결할 수 있었다. 

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함