- Operating_System
- programmers
- Image_classification
- SingleProject
- c++
- app
- codingTest
- Artificial_Intelligence
- Personal_Study
- Kubernetes
- 티스토리챌린지
- C
- Database_Design
- 2023_1st_Semester
- Univ._Study
- cloud_computing
- Unix_System
- study
- Algorithm
- tensorflow
- 리눅스마스터2급
- datastructure
- Python
- Java
- 자격증
- Baekjoon
- Android
- 오블완
- Linux
- pytorch
코딩 기록 저장소
[백준/Python] 1697번 : 숨바꼭질 본문
문제 정보
제목 : 숨바꼭질
번호 : 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
'백준 > 그래프와 순회' 카테고리의 다른 글
[백준/Python] 2667번 : 단지번호붙이기 (0) | 2024.01.15 |
---|---|
[백준/Python] 2178번 : 미로 탐색 (0) | 2024.01.10 |
[백준/Python] 7576번 : 토마토 (1) | 2023.12.27 |
[백준/Python] 1260번 : DFS와 BFS (0) | 2023.08.01 |
[백준/Python] 1012번 : 유기농 배추 (0) | 2023.07.26 |