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 | 29 | 30 | 31 |
Tags
- 알고리즘
- 브루트포스
- OS
- linux
- 프로그래밍
- PYTHON
- 구글 킥스타트
- 코딩 테스트
- 운영체제
- 프로그래머스
- CSS
- 그래프
- 백준
- kick start
- 코딩테스트
- 리눅스
- nlp
- 코딩
- 동적 프로그래밍
- google coding competition
- AI
- 파이썬
- dp
- 딥러닝
- 킥스타트
- 순열
- 동적프로그래밍
- 네트워크
- BFS
- DFS
Archives
- Today
- Total
오뚝이개발자
[백준 12851] 숨바꼭질 2 본문
728x90
300x250
문제
https://www.acmicpc.net/problem/12851
나의 풀이
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