코딩 기록 저장소

[백준/Python] 1697번 : 숨바꼭질 본문

백준/그래프와 순회

[백준/Python] 1697번 : 숨바꼭질

KimNang 2023. 12. 29. 16:39

문제 정보

제목 : 숨바꼭질

번호 : 1697번

사용 언어 : Python

문제 링크

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

 

1697번: 숨바꼭질

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

www.acmicpc.net

 

시간 제한 메모리 제한
2 초 128 MB

 

문제

수빈이는 동생과 숨바꼭질을 하고 있다. 수빈이는 현재 점 N(0 ≤ N ≤ 100,000)에 있고, 동생은 점 K(0 ≤ K ≤ 100,000)에 있다. 수빈이는 걷거나 순간이동을 할 수 있다. 만약, 수빈이의 위치가 X일 때 걷는다면 1초 후에 X-1 또는 X+1로 이동하게 된다. 순간이동을 하는 경우에는 1초 후에 2*X의 위치로 이동하게 된다.

수빈이와 동생의 위치가 주어졌을 때, 수빈이가 동생을 찾을 수 있는 가장 빠른 시간이 몇 초 후인지 구하는 프로그램을 작성하시오.

 

입력

첫 번째 줄에 수빈이가 있는 위치 N과 동생이 있는 위치 K가 주어진다. N과 K는 정수이다.

 

출력

수빈이가 동생을 찾는 가장 빠른 시간을 출력한다.

 

입출력 예제


나의 풀이

수빈이가 있는 위치 N, 동생이 있는 위치 K를 입력받아 split()을 이용해 문자열을 나누어 int형으로 변환합니다. 이때 map함수를 사용합니다. pointMap이라는 리스트를 선언해 0부터 100,000까지 0으로 저장합니다. 이것은 수빈이의 이동시간을 저장해두는 리스트입니다. 그다음 deque를 선언하여 수빈이의 처음 위치인 N을 저장합니다.

queue에 요소가 있는 동안 반복하는 while루프를 이용했습니다. 수빈이의 현재위치를 subin_pos에 저장하여 이 위치가 K와 같으면 걸린 시간을 출력한 후 break하고, 같지 않다면 수빈이가 갈 수 있는 위치 중 유효한 범위(0~100,000) 안에 있으면서 방문 안한 위치를 찾아서 queue에 위치를 저장하고 pointMap에 시간을 저장합니다.

 

코드

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

# 수빈이가 있는 위치 N, 동생이 있는 위치 K
N,K = map(int,input().split())
pointMap = [0 for _ in range(100001)] # 수빈이 이동 시간을 저장하는 리스트

queue = deque()
queue.append(N)

while(queue) :
    subin_pos = queue.popleft()
    if (subin_pos == K) :
        print(pointMap[subin_pos])
        break
    else : # 수빈이가 갈 수 있는 위치 중 방문 안한 곳 찾아서 queue에 subin_pos저장, pointMap에 시간 저장함
        if ( 0<=(subin_pos-1) and pointMap[subin_pos-1] == 0) :
            queue.append( subin_pos-1 )
            pointMap[subin_pos-1] = pointMap[subin_pos]+1
        
        if ( (subin_pos+1)<=100000 and pointMap[subin_pos+1] == 0) :
            queue.append( subin_pos+1 )
            pointMap[subin_pos+1] = pointMap[subin_pos]+1

        if( subin_pos*2<=100000 and pointMap[subin_pos*2] == 0) :
            queue.append( subin_pos*2 )
            pointMap[subin_pos*2] = pointMap[subin_pos]+1