[백준 1697번] 숨바꼭질
🎯 백준 - 1697.숨바꼭질
🤔 나의 풀이
📌 문제
- 백준 1697번 숨바꼭질
- BFS를 활용하는 문제이다.
📌 날짜
2020.02.11
📌 시도 횟수
7 try
💡 Code
from collections import deque
def bfs(x):
visited = set()
cnt = 0
queue = deque([[x, cnt]])
while queue:
next = queue.popleft()
cnt = next[1]
if next[0] == k:
return next[1]
visited.add(next[0])
if (next[0] - 1) not in visited and next[0] - 1 >= 0:
queue.append([next[0] - 1, cnt + 1])
if (next[0] + 1) not in visited and next[0] + 1 < 100001:
queue.append([next[0] + 1, cnt + 1])
if (next[0] * 2) not in visited and next[0] * 2 < 100001:
queue.append([next[0] * 2, cnt + 1])
n, k = map(int, input().split())
print(bfs(n))
💡 문제 해결 방법
- BFS의 기본적인 틀을 조금 변형했다.
- 각 경로마다 count가 달라지는 것을 어떻게 구현할까 하다가,
차라리 처음부터 queue를 deque(list)로 만들어 queue의 요소가
>> list = [현재 이동 위치, 몇 초 지났는지] 가 되도록 만들었다.
- cnt = next[1]를 통해 현재 값의 count를 매번 제대로 갱신해줄 수 있었다.
- 그리고 모든 경우에 대해 전부 다 BFS를 하게 되면 런타임에러가 뜨므로,
(다음에 큐에 삽입할 숫자가 유효한 수인지 & 이미 방문하지는 않았는지)를 고려했다.
💡 새롭게 알게 된 점
⭐in 시간복잡도 비교
- set의 in : O(1)
- list의 in : O(N)
❌ (한번에 맞추지 못한 경우) 오답의 원인
😂 런타임 에러가 엄~청 많이 발생했다. 그 원인으로는...
1. visited를 해주지 않아서 런타임 에러가 났다.
이전에 검사한 숫자가 또 나오는 경우 다시 탐색할 필요가 없었다.
2. next-1/next+1/next*2 가 범위를 벗어나는 경우를 고려하지 않았다.
>> next[0] - 1 >= 0
>> next[0] + 1 < 100001
>> next[0] * 2 < 100001
이걸 처리해주지 않았다.
3. visited를 set으로 만들지 않았다! 검색해보니까..
-------------------------
- set의 in : O(1)
- list의 in : O(N)
-------------------------
이라고 한다. 그래서 시간초과가 났나부다😭
지금이라도 알아서 다행이다.
Author And Source
이 문제에 관하여([백준 1697번] 숨바꼭질), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@eunseokim/백준-1697번-숨바꼭질저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)