문제
수빈이는 동생과 숨바꼭질을 하고 있다. 수빈이는 현재 점 N(0 ≤ N ≤ 100,000)에 있고, 동생은 점 K(0 ≤ K ≤ 100,000)에 있다. 수빈이는 걷거나 순간이동을 할 수 있다. 만약, 수빈이의 위치가 X일 때 걷는다면 1초 후에 X-1 또는 X+1로 이동하게 된다. 순간이동을 하는 경우에는 1초 후에 2*X의 위치로 이동하게 된다.
수빈이와 동생의 위치가 주어졌을 때, 수빈이가 동생을 찾을 수 있는 가장 빠른 시간이 몇 초 후인지 구하는 프로그램을 작성하시오.
입력
첫 번째 줄에 수빈이가 있는 위치 N과 동생이 있는 위치 K가 주어진다. N과 K는 정수이다.
출력
수빈이가 동생을 찾는 가장 빠른 시간을 출력한다.
아이디어
1. 일직선 상에서 움직이는 것 => 1차원 배열
2. 최소 시간을 찾아야 하므로, BFS(너비 우선 탐색)를 쓰는 것이 좋다
3. 테스트 케이스를 돌려 볼 수 있도록 일단 작은 범위에서 탐색하고, 최종 제출할 때 범위를 100000으로 늘려주자
4. 방문 배열은 꼭 100001까지!
문제 코드
from collections import deque
# deque를 사용하면 시간을 줄일 수 있다
def bfs(n, k):
queue = deque()
visited = [0 for _ in range(100001)] # 인덱스 에러 주의!
visited[n] = 1 # 방문 표시
queue.append(n)
while queue:
size = len(queue)
for _ in range(size):
now_n = queue.popleft()
if now_n == k: # 동생 만났으면
return print(visited[now_n] - 1)
# 못 만났으면 걷거나 순간이동해야지 (탐색하기)
# 걷기
for d in [-1, 1]: # 앞으로 한 칸 또는 뒤로 한 칸
next_n = now_n + d
# 범위 안에 있고, 방문한 적이 없어야 함
if 0 <= next_n <= 100000 and visited[next_n] == 0:
visited[next_n] = visited[now_n] + 1
queue.append(next_n)
# 순간 이동
next_n = now_n * 2
# 범위 안에 있고, 방문한 적이 없어야 함
if 0 <= next_n <= 100000 and visited[next_n] == 0:
visited[next_n] = visited[now_n] + 1
queue.append(next_n)
N, K = map(int, input().split())
maps = [0 for _ in range(100000)]
bfs(N, K)
'Algorithm > Baekjoon Online Judge' 카테고리의 다른 글
| 백준 2477. 참외밭 (파이썬) (0) | 2022.02.28 |
|---|---|
| 백준 10163. 색종이 (파이썬/ 47, 52점 해결법) (0) | 2022.02.27 |
| 백준 14696. 딱지놀이 (파이썬) (0) | 2022.02.27 |
| 백준 2605. 줄 세우기 (파이썬) (0) | 2022.02.27 |
| 백준 2563. 색종이 (파이썬) (0) | 2022.02.27 |
