반응형
리뷰
bfs로 해결하였다. if문에서 순서를 잘못 배치해서 계속 indexError가 났다.. 휴
문제 풀이
- 현재 위치 n과 목표 위치 k를 변수로 받아오고 방문 처리할 리스트를 100001 크기로 생성한다. 0 에서 10만 범위
- 방향은 현재 위치 x에서 -1 혹은 1로 이동하거나 *2인 위치로 이동하는 것이니 -1 및 1만 생성해 준다.
- 현재 위치, 이동 수를 튜플로 bfs를 실행한다. 입력받은 튜플을 큐에 넣고 현재 위치를 방문 표시 한다.
- bfs를 실행한다. 이때 이동할 범위가 방문 리스트의 범위를 초과하지 않도록 주의한다.
- 현재 위치가 k에 도달했을 경우 이동한 횟수를 출력해 준다.
참고 사항
if문을 실행할때 이동할 위치가 0이상 10만 이하인지를 먼저 체크해 줘야 나처럼 indexError가 나지 않는다.
(if문의 and 비교 연산자 : 앞의 식이 False일 경우 뒤의 식은 체크 자체를 안함)
정답 코드
제출 코드
from collections import deque
v = [False] * 100001
n, k = map(int, input().split())
dist = (-1, 1)
def bfs(index):
q = deque([index])
v[index[0]] = True
while q:
x, cnt = q.popleft()
if x == k:
return cnt
elif x < k:
x1, x2, x3 = x + dist[0], x + dist[1], x * 2
if 0 <= x1 < 100001 and not v[x1]:
v[x1] = True
q.append((x1, cnt + 1))
if 0 <= x2 < 100001 and not v[x2]:
v[x2] = True
q.append((x2, cnt + 1))
if 0 <= x3 < 100001 and not v[x3]:
v[x3] = True
q.append((x3, cnt + 1))
else:
x1 = x + dist[0]
if not v[x1] and 0 <= x1 < 100001:
q.append((x1, cnt + 1))
print(bfs((n, 0)))
최적화 코드
from collections import deque
def bfs(n, k):
v = [False] * 100001
q = deque([(n, 0)])
v[n] = True
while q:
x, cnt = q.popleft()
if x == k:
return cnt
for nx in (x - 1, x + 1, x * 2):
if 0 <= nx < 100001 and not v[nx]:
v[nx] = True
q.append((nx, cnt + 1))
n, k = map(int, input().split())
print(bfs(n, k))
728x90
반응형
'알고리즘 공부 > 파이썬(Python)' 카테고리의 다른 글
백준 11724 연결요소의 개수 파이썬, C++ (0) | 2024.07.16 |
---|---|
백준 7576번 토마토 파이썬, C++ (2) | 2024.07.16 |
백준 1012번 유기농 배추 파이썬 (1) | 2024.07.15 |
SWEA 1979번 D2 어디에 단어가 들어갈 수 있을까 파이썬, C++ (0) | 2024.07.14 |
백준 1213번 팰린드롬 만들기 파이썬 (0) | 2024.07.12 |