[BOJ] Python 백준 16928번 뱀과 사다리 게임 실버 1
https://www.acmicpc.net/problem/16928
문제 풀이
전형적으로 그래프 탐색 이론인 BFS(너비 우선 탐색)를 이용하면 쉽게 풀리는 문제다.
다만 보편적인 그래프 탐색은 2차원 배열에서 인덱스 접근을 통해 4방 혹은 8방 탐색을 하며 가장 가까운 Target Node를 찾지만 이번 문제는 1번부터 100번까지 각 노드를 번호로 구분할 수 있는 점, 1부터 6까지 적혀있는 주사위를 던져서 옮긴다는 점에 착안하여 1차원 배열에서 6가지 방법을 고려하면 된다는 것을 깨달아야 한다.
이점 외에는 딱히 조심해야 할 부분이 없으므로 바로 코드를 통해 설명하도록 하겠다.
from collections import deque
edge_info=[0 for i in range(101)]
n,m=map(int,input().split())
visited=[0 for i in range(100)]
queue=deque()
for i in range(n+m):
temp=list(map(int,input().split()))
edge_info[temp[0]]=temp[1]
#curr,cnt
queue.append([1,0])
while len(queue)>0:
curr,cnt=queue.popleft()
if curr==100:
print(cnt)
break
elif curr>=94:
print(cnt+1)
break
else:
for i in range(1,7):
if edge_info[curr+i]==0 and visited[curr+i]==0:
visited[curr+i]=1
queue.append([curr+i,cnt+1])
else:
if visited[curr+i]==0:
visited[curr+i]=1
visited[edge_info[curr+i]]=1
queue.append([edge_info[curr+i],cnt+1])
1번째 줄은 deque를 사용하기 위해 모듈을 Import 하였다.
물론 이번 문제는 최대 칸이 100개 밖에 없기 때문에 애초에 사이즈가 작아서 시간 복잡도를 줄이기 위해 굳이 deque를 사용할 필요는 없었지만 막상 필요한 상황에서 참고 문서 없이 Import 하려면 까먹기 때문에 잊지 않기 위해서라도 deque를 사용하였다.
만약 deque가 무엇인지 모르는 사람들은 아래 포스팅을 통해 학습하면 될 것이다.
https://khsung0.tistory.com/14
2번째 줄부터 5번째 줄까지는 간선 정보와 방문 체크, 큐 등을 사용하기 위한 초기화 작업이다.
6번째 줄은 반복문을 통해 간선 정보를 저장하였고 11번째 줄은 1번 칸부터 시작해서 BFS를 진행하기 위해 deque에 초기화했다.
12번째 줄부터는 BFS를 구현한 코드이다.
문제에 주어진대로만 구현하면 되기 때문에 딱히 설명할 부분은 없지만 필자는 조금이라도 시간 복잡도 상으로 효율적인 코드를 구현하기 위해 100일 때는 현재 카운트 출력, 94 이상일 때는 주사위를 한 번만 더 돌리면 100이 나오므로 카운트+1 출력, 그 외의 경우에만 다시 deque에 넣도록 구현하였다.
이렇게 구현하면 매번 deque에 넣을 때도 100을 초과하는지 체크하지 않아도 되기 때문이다.
문제는 10X10의 2차원 그래프인 것처럼 나왔지만 1차원 배열로 변환하여 생각하는 게 필요한 문제였다.
'알고리즘 > 알고리즘 문제 풀이' 카테고리의 다른 글
[BOJ] Python 백준 2294번 동전 2 골드 4 (0) | 2022.07.02 |
---|---|
[BOJ] Python 백준 4485번 녹색 옷 입은 애가 젤다지? 골드 4 (0) | 2022.04.19 |
[BOJ] Python 백준 13458번 시험 감독 브론즈 2 (0) | 2022.03.01 |
[BOJ] Python 백준 3425번 고스택 골드 3 (0) | 2022.02.18 |
[BOJ] Python 백준 11559번 Puyo Puyo 골드 4 (0) | 2022.02.07 |