300x250
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 프로그래밍
- DFS
- CSS
- kick start
- 그래프
- 알고리즘
- 네트워크
- 백준
- 구글 킥스타트
- 코딩
- OS
- 파이썬
- BFS
- AI
- 프로그래머스
- 동적프로그래밍
- nlp
- 코딩테스트
- google coding competition
- dp
- 동적 프로그래밍
- 리눅스
- 딥러닝
- PYTHON
- 운영체제
- 킥스타트
- 순열
- 브루트포스
- 코딩 테스트
- linux
Archives
- Today
- Total
오뚝이개발자
[백준 12851] 숨바꼭질 2 본문
728x90
300x250
문제
https://www.acmicpc.net/problem/12851
12851번: 숨바꼭질 2
수빈이는 동생과 숨바꼭질을 하고 있다. 수빈이는 현재 점 N(0 ≤ N ≤ 100,000)에 있고, 동생은 점 K(0 ≤ K ≤ 100,000)에 있다. 수빈이는 걷거나 순간이동을 할 수 있다. 만약, 수빈이의 위치가 X일 때
www.acmicpc.net
나의 풀이
BFS를 사용하여 풀었다.
걸린 시간 외에도 경우의 수를 카운트해야 하므로 방문 체크를 일반적인 방식으로 하면 안된다. 일반적인 경우처럼 방문한 곳은 다시 가지 않도록 하면 K까지의 경우의 수는 언제나 1이 되기 때문이다.
따라서 visit 체크를 2가지 경우로 나누어주어야 한다.(아래 코드 참고)
코드
# https://www.acmicpc.net/problem/12851
from collections import deque
N, K = map(int, input().split())
visit = [[-1,0] for _ in range(100001)] #[걸린시간, 경우의 수]
q = deque()
q.append(N) #(pos, time)
visit[N][0] = 0
visit[N][1] = 1
while q:
x = q.popleft()
for nx in [x-1, x+1, 2*x]:
if 0<= nx <= 100000:
# 첫방문이라면
if visit[nx][0] == -1:
visit[nx][0] = visit[x][0] + 1
visit[nx][1] = visit[x][1]
q.append(nx)
# 첫방문은 아니지만 최소시간이라면
elif visit[nx][0] == visit[x][0] + 1:
visit[nx][1] += visit[x][1]
print(visit[K][0])
print(visit[K][1])
728x90
300x250
'코딩 테스트 > 백준' 카테고리의 다른 글
[백준 2473] 세 용액 - 파이썬(Python) (0) | 2022.09.09 |
---|---|
[백준 20040] 사이클 게임 (0) | 2022.08.17 |
[백준 2638] 치즈 (0) | 2022.04.16 |
[백준 11660] 구간 합 구하기 5 (0) | 2022.04.14 |
[백준 2096] 내려가기 (0) | 2022.04.07 |
Comments