Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- Smart Commit
- 인구 이동
- 코딩테스트
- 백준3190
- 빙산
- 키패드 누르기
- 백준12904
- 전기 요금
- 백준
- 피보나치 수의 확장
- 프로그래머스
- 부스트캠프
- 파이썬
- 백준2573
- 백준16954
- 단어 수학
- 124 나라의 숫자
- 움직이는 미로 탈출
- A와 B
- 백준5710
- 백준1339
- 백준16234
- 백준 14499
- 로또의 최고 순위와 최저 순위
- 경비원
- 백준1697
- 백준1788
- 완주하지 못한 선수
- 백준 2564
- 소수 만들기
Archives
- Today
- Total
Today.dev
[BOJ_1697/Python] 숨바꼭질 본문
문제
풀이
from collections import deque
def bfs(start):
q = deque()
q.append((start, 0)) # 시작 점, 초(sec)
visited = set()
while q:
x, sec = q.popleft()
operation = [x - 1, x + 1, x * 2]
for i in range(3):
nx = operation[i]
if 0 <= nx <= 100000 and nx not in visited:
if nx == K:
return sec + 1
if nx <= K + 1:
visited.add(nx)
q.append((nx, sec + 1))
# 입력
N, K = map(int, input().split())
# 풀이 & 출력
print(N - K if N >= K else bfs(N))
1. N(수빈이 위치)이 K(동생 위치)보다 큰 값을 가지고 있다면 최소 시간으로 이동할 수 있는 연산이 x - 1 밖에 없기 때문에 단순히 N - K 를 출력한다.
2. N이 K보다 작은 값을 가지고 있다면 최소 시간을 찾기 위해 bfs 를 활용한다. 이때 엄청나게 많은 경우의 수가 발생하기 때문에 시간 초과를 막기 위해 2가지 조건을 덧붙였다.
- 노드 방문 확인(visited) 후 이미 방문한 노드라면 방문하지 않음
- 다음에 방문할 노드가 K + 1 이하일 경우에만 유망한 노드로 판단함 (K + 2 이상의 값에서 -1 을 반복하며 목표값에 도달하는 경우는 없다.)
'알고리즘 > 백준' 카테고리의 다른 글
[BOJ_3190/Python] 뱀 (0) | 2021.07.05 |
---|---|
[BOJ_5710/Python] 전기 요금 (0) | 2021.07.05 |
[BOJ_14499/Python] 주사위 굴리기 (0) | 2021.07.05 |
[BOJ_1339/Python] 단어 수학 (0) | 2021.05.31 |
[BOJ_16234/Python] 인구 이동 (0) | 2021.05.31 |
Comments