Algorithm

[BOJ] 1697번 숨바꼭질 - Python

lerrybe 2023. 7. 14. 01:02

문제

 

1697번: 숨바꼭질

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

www.acmicpc.net

 

 

풀이

  • 가중치가 있는 그래프에 대한 처리를 어떻게 하면 좋을지 고민할 수 있었던 문제
  • 일차원 배열이어도 접근 방식은 비슷하다.
  • 무게나 비용이 가장 적은 것 먼저 넣고 그것들을 먼저 뽑고 싶기에 큐를 사용했던 것이다, 가중치가 있으면 이를 만족하는 것이 맞다.
  • 해당하는 자료구조가 왜 등장했는지 생각하자.
from collections import deque


def solution(n, k):
    if n == k:
        return 0

    size = 200000
    d = [-1] * size

    queue = deque()
    queue.append(n)
    d[n] = 0  # visited 와 동일

    while queue:  # 조건
        x = queue.popleft()
        nx = x * 2  # 시간이 들지 않기 때문에 가장 적은 비용, 가장 먼저 큐에 들어 가야 함, 그래야 방문할 수 있는 가장 작은 값이 저장됨 (가중치가 있는 그래프임을 기억)
        if nx < size and d[nx] == -1:
            queue.append(nx)
            d[nx] = d[x]
        nx = x - 1
        if 0 <= nx < size and d[nx] == -1:
            queue.append(nx)
            d[nx] = d[x] + 1
        nx = x + 1
        if 0 <= nx < size and d[nx] == -1:
            queue.append(nx)
            d[nx] = d[x] + 1
    return d[k]


N, K = map(int, input().split())
print(solution(N, K))

'Algorithm' 카테고리의 다른 글

[알고리즘] 백트래킹 (Backtracking)  (0) 2023.07.14
[알고리즘] 재귀 (Recursion)  (0) 2023.07.14
[BOJ] 7569번 토마토 - Python  (0) 2023.07.14
[BOJ] 10026번 적록색약 - Python  (0) 2023.07.14
[BOJ] 2504번 괄호의 값 - Python  (0) 2023.07.14