반응형
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 |
Tags
- 힙
- level1
- BFS
- 다이나믹 프로그래밍
- DP
- programmers
- 브루트포스
- 수학
- python
- 코딩테스트
- 딕셔너리
- 프로그래머스
- MYSQL
- 운영체제
- 백준
- 재귀
- dfs
- 그리디
- level0
- 다익스트라
- 에라스토테네스의 체
- 가상메모리 관리
- 스택
- 가상메모리
- 구현
- N과M
- level3
- 파이썬
- BOJ
- level2
Archives
- Today
- Total
동캄의 코딩도장
백준 17071 [숨바꼭질 5] 파이썬 본문
반응형
https://www.acmicpc.net/problem/17071
어려웠다. 동생과 수빈의 도착 시간 차이가 짝수만큼 차이나면 결국 만날 수 있기에, 특정지점에 홀수 도착시간과 짝수도착시간을 분리하여 계산하는것이 핵심이었다.
from collections import deque
# 수빈이(N)와 동생(K) 위치 입력
N, K = map(int, input().split())
def search(subin, sister):
cnt = 0 # 시간 (이동 횟수)
q = deque()
q.append((subin, sister, cnt, 2)) # (수빈 위치, 동생 위치, 시간, 짝/홀 여부)
# 방문 여부 및 방문 시간 저장 배열
# visited[i] = [짝수 방문 여부, 짝수 방문 시간, 홀수 방문 여부, 홀수 방문 시간]
visited = [[False, 0, False, 0] for _ in range(500001)]
visited[subin][2] = True # 시작 위치 방문 체크
while q:
subin, sister, cnt, odd_even = q.popleft()
# 동생의 위치가 이전에 방문한 적이 있고, 이동 횟수 차이가 짝수이면 잡을 수 있음
if visited[sister][odd_even] and (cnt - visited[sister][odd_even + 1]) % 2 == 0:
return cnt
# 짝수/홀수 이동 상태 변경
odd_even = 0 if odd_even else 2
cnt += 1
sister += cnt # 동생은 cnt만큼 증가 (1+2+3+...)
if sister > 500000: # 범위를 벗어나면 continue
continue
# 수빈이 이동 가능한 경우 체크 (앞으로, 뒤로, 순간이동)
for next_subin in (subin + 1, subin - 1, subin * 2):
if 0 <= next_subin <= 500000 and not visited[next_subin][odd_even]:
visited[next_subin][odd_even] = True
visited[next_subin][odd_even + 1] = cnt
q.append((next_subin, sister, cnt, odd_even))
# 시작점과 목표점이 같다면 0 출력
if N == K:
print(0)
else:
result = search(N, K)
print(result if result is not None else -1) # 찾을 수 없으면 -1 출력
반응형
'코테 > BOJ' 카테고리의 다른 글
백준 1963 [소수 경로] 파이썬 (0) | 2025.03.16 |
---|---|
백준 1038 [감소하는 수] 파이썬 (0) | 2025.03.15 |
백준 1456 [거의 소수] 파이썬 (0) | 2025.03.15 |
백준 4948 [베르트랑 공준] 파이썬 (0) | 2025.03.15 |
백준 10610 [30] 파이썬 (0) | 2025.03.15 |