13549번: 숨바꼭질 3
수빈이는 동생과 숨바꼭질을 하고 있다. 수빈이는 현재 점 N(0 ≤ N ≤ 100,000)에 있고, 동생은 점 K(0 ≤ K ≤ 100,000)에 있다. 수빈이는 걷거나 순간이동을 할 수 있다. 만약, 수빈이의 위치가 X일 때
www.acmicpc.net
💡문제 분석 요약
탐색 알고리즘 중 하나인 BFS를 활용하여 문제를 풀이하면 쉽다.
DFS를 떠올릴 수 있으나, 이 문제에서 DFS은 적절한 방법이 될 수 없다. 효율성이 떨어지기 때문이다.
- 최단 경로 찾기의 비효율성: 현재의 문제는 가장 빠른 시간을 찾아야한다. 하지만 DFS는 깊이 우선 탐색의 특성으로, 최적이 아닌 경로를 더 오랫동안 탐색하게 될 수 있어 적합하지 않다.
💡알고리즘 설계
BFS 알고리즘을 만들기 위해, Queue 자료구조를 사용하며, 위치 정보를 Queue에 담고, 시간에 따라 해당 값을 추가(append), 추출(pop)하면 된다.
- 시간에 따라 이동이 달라지므로, 순간이동(0초)의 경우 가장 앞에 위치정보를 추가하고, 이동(1초)의 경우 가장 뒤에 값을 추가한다.
💡코드
from collections import deque
def bfs(N, K):
visited = [False] * 100001
queue = deque([(N, 0)])
visited[N] = True
while queue:
current_pos, current_time = queue.popleft()
if current_pos == K:
return current_time
for next_pos in (current_pos - 1, current_pos + 1, current_pos * 2):
if 0 <= next_pos <= 100000 and not visited[next_pos]:
visited[next_pos] = True
if next_pos == current_pos * 2:
queue.appendleft((next_pos, current_time))
else:
queue.append((next_pos, current_time + 1))
return -1
N, K = map(int, input().split())
print(bfs(N, K))
💡시간복잡도
BFS(Breadth-First Search) 알고리즘의 시간 복잡도는 O(N)으로 선형 시간이 소요된다. 그리고 N은 0 <= N <=100,000 이며 시간 및 메모리 제한에 문제가 없다.
- queue의 추가(apppend)와 추출(pop)의 시간복잡도는 O(1)이다.
💡 느낀점 or 기억할정보
탐색알고리즘을 사용할 때면, BFS, DFS를 고려하게되는데, 나는 구현이 BFS가 편리하여 BFS를 더 선호하곤했다. 하지만 이번 문제를 풀이해보면서 BFS가 적합할 때와 DFS가 적합한 때를 고려해서 선택해야함을 알 수 있었다. 구현 편의성 보다는 모두 구현할 수 있도록 연습을 하고, 상황에 알맞은 알고리즘을 사용할수 있도록 노력해야겠다.
728x90
'개인공부 > 알고리즘' 카테고리의 다른 글
[ 탐색 ] 백준 1261번 알고스팟, 다익스트라 (1) | 2024.03.27 |
---|---|
[ 수학 ] 백준 2609 최대공약수와 최소공배수, Kotlin, 유클리드 알고리즘 (0) | 2024.03.16 |
[ 수학 ] 백준 17427 약수의 합 2 kotlin (0) | 2024.03.15 |
[ DP ] 백준 15988번 1, 2, 3 더하기 3, Kotlin (0) | 2024.03.14 |
[ 그리디 ] 백준 1783 병든 나이트 (0) | 2024.03.07 |