일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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
- 그래프이론
- 프로그래머스스쿨
- level2
- web
- DP
- 문자열
- lv2
- 그래프 이론
- BFS
- 백준
- 파이썬
- DFS
- 브루트포스 알고리즘
- 다이나믹 프로그래밍
- programmers
- 알고리즘
- 딕셔너리
- 그래프 탐색
- 정렬
- 프로그래머스
- BASIC
- 웹 프론트엔드
- 스택
- CSS
- 너비 우선 탐색
- 그리디 알고리즘
- 자바스크립트
- JavaScript
- 자료구조
- 구현
Archives
- Today
- Total
DevLog:-)
[알고리즘][파이썬]1697-숨바꼭질 본문
반응형
문제
코드
import sys
from collections import deque
n, k = map(int,sys.stdin.readline().strip().split())
def bfs():
q = deque()
q.append(n)
while q:
v = q.popleft()
if v == k:
print(visited[v])
break
for nv in (v - 1, v + 1, v * 2):
if 0 <= nv <= MAX and not visited[nv]:
visited[nv] = visited[v] + 1
q.append(nv)
MAX = 10 ** 5 # 시간초과 방지
visited = [0] * (MAX + 1) # 이동하는 시간 count
bfs()
문제설명
출발지 N에서 도착지 K까지 (+1,-1,*2)로 이동하는 데 걸리는 시간을 구하는 문제이다.
접근방법
최단 거리를 구하는 유형으로 BFS 알고리즘을 이용할 수 있다.
코드설계
현재 위치 x에 (x-1),(x+1),(x*2)가 계속 연결되어 있는 그래프를 다룬다고 생각한다.
해당 인덱스 visited배열에 탐색 여부 겸 시간을 기록한다.
발생한 오류
1. 런타임 에러
100000이 넘어가는 숫자가 배열 인덱스로 접근 할 때 발생한다.
2. 메모리 추가
visited를 제거하고 코드를 짜보고 싶어서 해봤더니 메모리 초과가 발생했다.
하나의 숫자에 여러 가지 경로로 접근이 가능한데 visited를 설정을 안 하면 한 가지 숫자에서 여러 번 계산하게 된다.
따라서 탐색을 한 숫자는 visited로 체크가 반드시 필요하다.
3.시간 초과
nv의 조건문을 <k+2로 두었는데 k의 범위가 (0 ≤ K ≤ 100,000)로 시간 초과가 발생하게 된다.
이를 방지하기 위해 nv <=100000으로 두어야 한다.
반응형
'알고리즘 > 백준' 카테고리의 다른 글
[알고리즘][파이썬]1251-단어 나누기 (0) | 2023.06.14 |
---|---|
[알고리즘][파이썬]5585-거스름 (0) | 2023.06.07 |
1546-평균 (1) | 2023.05.21 |
[알고리즘][파이썬]2667-단지번호붙이기 (0) | 2023.05.20 |
[알고리즘][파이썬] 2178-미로 탐색 (1) | 2023.05.17 |