티스토리 뷰
728x90
https://www.acmicpc.net/problem/1697
1. 풀이
- BFS 알고리즘을 사용하자
문제에서 말하는 최소 시간은 결국 수빈이가 동생까지 가는 데 이동하는 최단 거리로 치환할 수 있다. 또한 앞으로 1칸 이동, 뒤로 1칸 이동, 순간 이동은 모두 이동하는 데 1초가 걸린다. 즉, 모든 이동 방식의 가중치가 모두 1이다. 따라서 이 문제는 가중치가 1로 동일한 그래프에서 최단 경로를 찾는 것이므로 BFS 알고리즘이 적합하다. 참고로 BFS는 노드를 한 번만 방문하면 되며, 처음으로 노드를 방문한 시점이 가장 빠른 시간임을 보장한다.
번외로 dp를 통해 문제를 해결할 수는 있지만, dp는 일반적으로 이동에 따른 가중치가 서로 다른 경우에 활용한다.
2. 정답 코드
from collections import deque
INF = 999999
n, k = map(int, input().split())
visited = [False] * 100001
times = [INF] * 100001
times[n] = 0
queue = deque([n])
while queue:
x = queue.popleft()
if x == k:
break
if x < 100000 and not visited[x + 1]:
visited[x + 1] = True
times[x + 1] = times[x] + 1
queue.append(x + 1)
if x > 0 and not visited[x - 1]:
visited[x - 1] = True
times[x - 1] = times[x] + 1
queue.append(x - 1)
if x * 2 <= 100000 and not visited[x * 2]:
visited[x * 2] = True
times[x * 2] = times[x] + 1
queue.append(x * 2)
print(times[k])
백준에 코드를 제출하고나서 다른 사람들의 코드도 확인해 보았는데,
더 깔끔하고 간단하게 코드를 작성할 수 있어 추가로 기록한다.
from collections import deque
n, k = map(int, input().split())
visited = [False] * 100001
queue = deque([(n, 0)])
answer = -1
while queue:
x, time = queue.popleft()
if x == k:
answer = time
break
for y in [x - 1, x + 1, x * 2]:
if 0 <= y <= 100000 and not visited[y]:
queue.append((y, time + 1))
visited[y] = True
print(answer)
728x90
'코딩 테스트 > 백준' 카테고리의 다른 글
[백준] 15961번 회전 초밥 파이썬 풀이 (0) | 2025.02.22 |
---|---|
[백준] 1149번 RGB거리 파이썬 풀이 (0) | 2025.02.22 |
[백준] 14891번 톱니바퀴 파이썬 풀이 (0) | 2024.10.09 |
[백준] 14499번 주사위 굴리기 파이썬 풀이 (0) | 2024.03.23 |
[백준] 5582번 공통 부분 문자열 파이썬 풀이 (0) | 2024.03.21 |