[백준 1697] 숨바꼭질

Junyoung Park·2022년 2월 25일
0

코딩테스트

목록 보기
75/631
post-thumbnail

1. 문제 설명

숨바꼭질

2. 문제 분석

n번 노드에서 k번 노드까지 이동 가능한 방법이 세 가지 있을 때 가장 짧은 시간을 구한다.

  1. 모든 노드를 미리 만들어 놓는다. 0으로 만들어 아직 방문하지 않았음을 표시하자.
  2. 시작 노드 n번을 큐에 넣고 BFS를 실행한다. 현재 노드 번호에 +1, -1, *2를 한 노드를 방문하자.
  3. 노드 번호가 주어진 노드 범위 안에 존재하고, 아직 방문한 적이 없다면 큐에 넣는다.
  • 리스트로 노드를 선언하지 않은 적이 있었는데, 이 경우 방문한 적이 있는지 없는지 체크하기 불편했다. 리스트로 먼저 선언해 이를 한꺼번에 처리했다.

3. 나의 풀이

from collections import deque
n, k = map(int, input().split())

nodes = [0]*(100001)
# 미리 모든 노드를 만든다.
queue = deque([])
queue.append([n, 0])

while queue:
    cur, time = queue.popleft()
    nodes[cur] = 1
    # 방문한 노드는 1로 마크
    if cur == k: break

    offsets = [1, -1, cur]
    # 현재 위치 cur에 이 값을 더하면 이동 가능한 다음 좌표를 얻을 수 있다.
    for offset in offsets:
        next = cur + offset
        if next < 0 or next > 100000: continue
        # 이동 가능한 범위이고 방문한 적이 없다면 이동한다.
        if nodes[next] == 0:
            queue.append([next, time+1])
            nodes[next] = 1

print(time)
profile
JUST DO IT

0개의 댓글