728x90
출처 : 1697번: 숨바꼭질 (acmicpc.net)
숨바꼭질 성공출처다국어분류
한국어
시간제한 메모리 제한 제출 정답 맞은 사람 정답 비율
2 초 | 128 MB | 105226 | 29444 | 18315 | 24.991% |
문제
수빈이는 동생과 숨바꼭질을 하고 있다. 수빈이는 현재 점 N(0 ≤ N ≤ 100,000)에 있고, 동생은 점 K(0 ≤ K ≤ 100,000)에 있다. 수빈이는 걷거나 순간이동을 할 수 있다. 만약, 수빈이의 위치가 X일 때 걷는다면 1초 후에 X-1 또는 X+1로 이동하게 된다. 순간이동을 하는 경우에는 1초 후에 2*X의 위치로 이동하게 된다.
수빈이와 동생의 위치가 주어졌을 때, 수빈이가 동생을 찾을 수 있는 가장 빠른 시간이 몇 초 후인지 구하는 프로그램을 작성하시오.
입력
첫 번째 줄에 수빈이가 있는 위치 N과 동생이 있는 위치 K가 주어진다. N과 K는 정수이다.
출력
수빈이가 동생을 찾는 가장 빠른 시간을 출력한다.
[ 문제 설명 ]
동생은 어떤 위치에 숨어 있고, 수빈이가 한 칸 앞 한칸 뒤, *2만큼 순간 이동하여 동생을 찾는 것입니다.
혹시 그래프 이동 문제를 푼 적이 있으신지요?
상하좌우로 움직이면서 찾고 그랬지요?
여기서는 x + 1, x - 1, x * 2 방향으로 찾아가는 코딩을 하면 되는 것입니다.
그리고 그 순회는 bfs방식으로 풀어봅니다.
[ 코드 ]
from collections import deque
cnt = 0
def BFS():
q = deque()
q.append(n) # 5
while q:
x = q.popleft()
if x == k: # 동생을 찾았을 때
print(dis[x])
break
for dx in (x - 1, x + 1, x * 2): # 4, 6, 10
if 0 <= dx <= MAX and not dis[dx]: # 범위 밖을 나가지 않았는지 체크
dis[dx] = dis[x] + 1 # 거리라기 보단 이동 횟수
q.append(dx) # 그방향 다시 탐색
MAX = 100000
n, k = map(int, input().split())
dis = [0] * (MAX + 1)
BFS()
후기
동생은 멎춰있기에 코드가 쉬워지고
bfs를 알고 있다면 할만하게 풀 수 있고, 모른다면 이 기회에
다시 알아보자!
728x90
'백준 코딩 테스트' 카테고리의 다른 글
백준 9019번 - DSLR (0) | 2021.04.10 |
---|---|
백준 1963번 - 소수 경로 (0) | 2021.04.10 |
백준 10971번 - 외판원 순회2 (0) | 2021.04.08 |
백준 10819번 - 차이를 최대로 (0) | 2021.04.08 |
백준 9095번 - 1, 2, 3 더하기 (0) | 2021.04.07 |