내 잡다한 노트

13913 숨바꼭질4 백준 파이썬 본문

백준, 프로그래머스(파이썬)

13913 숨바꼭질4 백준 파이썬

peanutwalnut 2022. 4. 14. 21:13

문제)

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

 

13913번: 숨바꼭질 4

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

www.acmicpc.net

 

소스코드)

from collections import deque
n, k = map(int, input().split())
visited = [-1] * 100001
move = [0] * 100001

def path(x, k):
    ans= []
    temp = x
    for _ in range(visited[k]+1):
        ans.append(temp)
        temp = move[temp]
    return ans[::-1]

def bfs(n, k):
    q = deque()
    q.append(n)
    visited[n] = 0
    while q:
        temp = q.popleft()
        if temp == k:
            print(visited[temp])
            a = path(temp, k)
            print(*a)
            break
        n1 = temp + 1
        n2 = temp - 1
        n3 = temp * 2

        for m in [n1, n2, n3]:
            if 0 <= m <= 100000 and visited[m] == -1:
                visited[m] = visited[temp] + 1
                q.append(m)
                move[m] = temp

bfs(n, k)
#print(visited)

 

정답의 조건중 수빈이가 동생을 찾는 빠른 시간은 쉽게 해결했으나 어떻게 이동했는 지를 어떻게 접근해야할 지 몰라 헤맸었다.

다른 사이트의 코드를 참고해 공부하니

move 변수에 인덱스에는 자식노드에 해당하고 값에는 부모노드를 입력하는 것이다.

와우!!! 대단한 발상이라 기억하고자 글도 쓰게됐다.

bfs를 다 돌려서 찾았을 때 path함수를 호출해 move[k]에 적힌 부모노드를 찾아서 거꾸로 올라가는 것이다.

이 부분 발상이 안되서 dfs로 다시풀어야하나 고민했는데 이런 방법도 있었다.

 

 

 

 

'백준, 프로그래머스(파이썬)' 카테고리의 다른 글

11725 파이썬 백준 트리  (0) 2022.05.08
2250 파이썬 백준  (0) 2022.05.08
파이썬 백준 16724 피리부는 사나이  (0) 2022.04.03
6064 카잉 달력 파이썬  (0) 2022.03.28
10159 저울 [파이썬]  (0) 2022.03.23