반응형
SMALL
백준 1697번 <숨바꼭질> 문제 보기
https://www.acmicpc.net/problem/1697
1697번: 숨바꼭질
수빈이는 동생과 숨바꼭질을 하고 있다. 수빈이는 현재 점 N(0 ≤ N ≤ 100,000)에 있고, 동생은 점 K(0 ≤ K ≤ 100,000)에 있다. 수빈이는 걷거나 순간이동을 할 수 있다. 만약, 수빈이의 위치가 X일
www.acmicpc.net
백준 1697번 <숨바꼭질> 문제 풀이
from collections import deque
n, k = map(int, input().split())
dist = [0 for _ in range(100001)]
queue = deque()
queue.append(n)
while queue:
value = queue.popleft()
if value == k:
print(dist[value])
else:
if 0 <= value-1 <= 100000 and dist[value-1] == 0:
dist[value-1] = dist[value]+1
queue.append(value-1)
if 0 <= value+1 <= 100000 and dist[value+1] == 0:
dist[value+1] = dist[value]+1
queue.append(value+1)
if 0 <= value*2 <= 100000 and dist[value*2] == 0:
dist[value*2] = dist[value]+1
queue.append(value*2)
- 접근 방식
- 문제를 읽자마자 ‘엇, DP 같은데?’ 라는 생각이 들면서 고민없이 문제를 풀게 되었다. 바로 풀 수 있겠다는 설레는 마음에 제대로 된 설계도 않고(아이패드 꺼내기가 귀찮았던 것도 있고…ㅎ), 제출했더니 당연히! [시간 초과] 가 떴다. 아쉬운 마음이 컸지만, 진지하게 다시 고민해 보게 되었고 최단 시간을 찾는 문제이니 DFS나 BFS로 풀 수 있겠다고 생각했다. DFS로 모든 깊이까지 갔다오는 것 보다는 BFS로 처음 도달했을 때의 시간을 구하는 것이 더 효율적이라 생각했다.
- 코드 설명
- N과 K의 범위가 0에서 100000이므로, 시간을 저장하는 dist를 100001개로 설정
- deque를 이용해서 k를 처음 방문했을 때의 최단 시간을 찾아줄 수 있음
- value-1 혹은 value+1 혹은 value*2 의 범위와 방문여부를 따져 최단 시간을 정해주고 deque에 넣어줌
- 후기
- 다 풀고 나서 다른 분들 블로그에 풀이 검색해봤었는데 다들 for 반복문을 통해 if문 3개를 1개로 줄일 수 있었다 ㅠㅠ 나는 너무 노가다였다 ㅎㅎ….
if 0 <= value-1 <= 100000 and dist[value-1] == 0:
dist[value-1] = dist[value]+1
queue.append(value-1)
if 0 <= value+1 <= 100000 and dist[value+1] == 0:
dist[value+1] = dist[value]+1
queue.append(value+1)
if 0 <= value*2 <= 100000 and dist[value*2] == 0:
dist[value*2] = dist[value]+1
queue.append(value*2)
파이썬을 제대로 사용하지 못하고 노가다 형식으로 작성한 코드다. 다른 분들의 코드리뷰를 하면서 for 반복문의 특징을 익히고 코드를 고쳐볼 수 있었다. 고친 코드는 아래와 같다.
for i in (value-1, value+1, value*2):
if 0 <= i <= 100000 and dist[i] == 0:
dist[i] = dist[value]+1
반응형
LIST
'알고리즘 공부 > 코딩테스트(백준)' 카테고리의 다른 글
[백준 2440번] 별 찍기 - 3 (Java 자바) 풀이 방법 (0) | 2023.03.30 |
---|---|
[백준 1149번] RGB거리 (Python 파이썬) 풀이 방법 (0) | 2023.03.10 |
[백준 2512번] 예산 (Python 파이썬) 풀이 방법 (0) | 2023.02.25 |
[백준 11478번] 서로 다른 부분 문자열의 개수 (Python 파이썬) 풀이 방법 (0) | 2023.02.18 |
[백준 9465번] 스티커 (Python 파이썬) 풀이 방법 (0) | 2023.02.18 |