Sangmun

백준 12851번 숨바꼭질2 본문

알고리즘/백준

백준 12851번 숨바꼭질2

상상2 2022. 12. 14. 09:16

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

 

12851번: 숨바꼭질 2

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

www.acmicpc.net

BFS를 이용한 숨바꼭질 문제 시리즈 중에 하나이다.

숨바꼭질 시리즈에서 최단 경로를 구하는 문제의 솔루션을 약간 변형을 하였다.

엣지 케이스를 처리하는 로직을 포함하지 않고 제출을 하지 엣지 케이스 때문에 시간초과가 난다는 문제가 있었다.

 

import sys
from collections import deque
input = sys.stdin.readline

n,k = map(int,input().split())

# 엣지 케이스를 위한 if문
if n > k:
    print(n - k)
    print(1)

else:

    visited = [0]*100001
    q = deque()
    q.append((n,[n]))

    count = 0
    Shortest_time = 1e9

    while q:
        a, SP = q.popleft()
        
        # 이미 거쳐온 경로가 현재 최단 경로보다 크면 패스
        if not (len(SP) -1 <= Shortest_time):
            continue

        if a == k:
            if len(SP) - 1 <= Shortest_time:
                Shortest_time = len(SP) - 1
                count += 1

        visited[a] = 1

        for each in [2,1,-1]:
            tmp = a
            if each == 2:
                if 0 <= tmp*each <= 100000:
                    if not visited[tmp*each]:
                        q.append((tmp*each,SP + [tmp*each]))

            else:
                if 0 <= tmp + each <= 100000:
                    if not visited[tmp + each]:
                        q.append((tmp + each,SP +[tmp + each]))

    print(Shortest_time)
    print(count)

'알고리즘 > 백준' 카테고리의 다른 글

백준 9935번 문자열 폭발  (0) 2022.12.14
백준 17144번 미세먼지 안녕!  (0) 2022.12.14
백준 2096번 내려가기  (0) 2022.12.12
백준 15686번 치킨 배달  (0) 2022.12.12
백준 14938번 서강그라운드  (0) 2022.12.10
Comments