16928-g5 성공
This commit is contained in:
87
workbook_8708/gold/16928-g5.py
Normal file
87
workbook_8708/gold/16928-g5.py
Normal file
@@ -0,0 +1,87 @@
|
||||
# 뱀과 사다리 게임
|
||||
|
||||
import sys
|
||||
from collections import deque
|
||||
|
||||
input = sys.stdin.readline
|
||||
|
||||
def solution():
|
||||
n, m = map(int, input().rstrip().split())
|
||||
g = [-1] * 101
|
||||
visited = [-1] * 101
|
||||
for _ in range(n+m):
|
||||
v, w = map(int, input().rstrip().split())
|
||||
g[v] = w
|
||||
|
||||
q = deque([1])
|
||||
visited[1] = 0
|
||||
while q:
|
||||
now = q.popleft()
|
||||
for k in range(1, 7):
|
||||
nxt = now+k
|
||||
if nxt > 100:
|
||||
continue
|
||||
|
||||
if g[nxt] != -1:
|
||||
nxt = g[nxt]
|
||||
|
||||
if visited[nxt] == -1:
|
||||
q.append(nxt)
|
||||
visited[nxt] = visited[now]+1
|
||||
|
||||
print(visited[100])
|
||||
return
|
||||
|
||||
solution()
|
||||
|
||||
"""
|
||||
걸린 시간: 몰라
|
||||
|
||||
시간 복잡도: 각 칸당 한번씩만 방문하기 때문에 O(100)이다.
|
||||
|
||||
해설: 1697-s1과 같은 실수를 반복했다. 앞 뒤로 갈 수 있는 것은 dp로 할때 어디부터 채워야할지 모르기 때문에 bfs로 해야했거늘..
|
||||
현재 칸에서 주사위를 굴려서 6칸을 다 갈 수 있고, 이때 사다리나 뱀이 있으면 그곳으로 바로 이동해야 한다.
|
||||
근데 나는 일단 6칸을 다 방문처리하고, now에서 사다리나 뱀이 있으면 방문하는 방식으로 진행을 했다.
|
||||
하지만 이렇게 하면 사다리를 타고 올라가는 곳이 레벨이 1이라고 할때, 주사위로 가서 한 번 더 간 칸, 즉 레벨 2의 칸이 큐에 먼저 들어간다.
|
||||
레벨이 꼬여버리기 때문에 주사위로 온 칸이 사다리가 연결되어 있다면 바로 이동해서 그 칸을 큐에 넣는 것이 순서가 맞다.
|
||||
주사위로 나온 칸은 그럼 계속 방문처리가 안되는 것 아니냐라고 생각할 수 있지만, 실제로 방문처리가 안되기도 하고
|
||||
그 칸은 항상 사다리로 이동한 칸과 같은 취급을 받기 때문에 상관없다.
|
||||
이렇게 최단거리 문제를 bfs로 풀때는 레벨을 잘 따져야 할 것 같다.
|
||||
"""
|
||||
|
||||
# def dp_up(dp, g): # 30분
|
||||
# for i in range(2, 7):
|
||||
# for j in range(i-1, 0, -1):
|
||||
# dp[i] = min(dp[i], dp[j]+1)
|
||||
# dp[i] = min(dp[i], dp[g[i]] if g[i] != -1 else float('inf'))
|
||||
|
||||
|
||||
# for i in range(7, 101):
|
||||
# dp[i] = min(dp[i-1]+1, dp[i-2]+1, dp[i-3]+1, dp[i-4]+1, dp[i-5]+1, dp[i-6]+1, dp[g[i]] if g[i] != -1 else float('inf'))
|
||||
|
||||
# return
|
||||
|
||||
# def dp_down(dp, g):
|
||||
# for i in range(100, 1, -1):
|
||||
# dp[i] = min(dp[i-1]+1, dp[i-2]+1, dp[i-3]+1, dp[i-4]+1, dp[i-5]+1, dp[i-6]+1, dp[g[i]] if g[i] != -1 else float('inf'))
|
||||
|
||||
# return
|
||||
|
||||
# def solution():
|
||||
# n, m = map(int, input().rstrip().split())
|
||||
# g = [-1] * 101
|
||||
# dp = [float('inf')] * 101
|
||||
# dp[1] = 0
|
||||
|
||||
# for _ in range(n+m):
|
||||
# v, w = map(int, input().rstrip().split())
|
||||
# g[w] = v # 도착점이 key, 시작점이 value
|
||||
|
||||
# dp_up(dp, g)
|
||||
# dp_down(dp, g)
|
||||
# dp_up(dp, g)
|
||||
# print(dp[100])
|
||||
# # print(dp)
|
||||
# # print("70:", dp[70], "72:", dp[72], "67:", dp[67], "68:", dp[68], "98:", dp[98])
|
||||
|
||||
# solution()
|
||||
Reference in New Issue
Block a user