본문 바로가기

백준 코딩 테스트

백준 1696번 - 숨바꼭질

728x90

출처 : 1697번: 숨바꼭질 (acmicpc.net)

 

1697번: 숨바꼭질

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

www.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