728x90
https://www.acmicpc.net/problem/2310
2310번: 어드벤처 게임
입력은 여러 개의 미로로 주어진다. 각 미로의 첫 줄에는 미로의 방 수를 나타내는 정수 n(1 ≤ n ≤ 1000)이 주어진다. 다음 n 줄에는 각 방의 정보가 주어진다. 각 방의 정보는 방의 내용물을 나타
www.acmicpc.net
문제 유형으로는 dfs, bfs문제라고 나와있는데 나는 백트래킹 문제라고 생각한다.
bfs로 먼저 접근을 했었는데, 방문처리가 중복이 되는 경우가 발생하는 문제점이 있었다.
또한 문제에서 제시한 조건으로 트롤을 만났을때 통행료를 확인한 후 이 방을 방문처리 할 지 말지가 정해진다. 통행료가 부족해서 통과할 수 없으면 재귀함수를 탈출시키고 통과할 수 있으면 연결된 다음 방 (next)을 dfs로 탐색한다.
그리고 현재의 경로를 선택하지 않는 경우도 있을 수 있으니 다시 visited[now] = False 로 백트래킹 한다.
from collections import deque, defaultdict
def dfs(now, total_money):
global flag, visited
x = graph[now][0]
money = int(graph[now][1])
next_rooms = list(map(int, graph[now][2:-1]))
if x == 'E': # empty room
total_money += money
elif x == 'L':
if total_money <= money:
total_money = money
else: # T
if total_money >= money:
total_money -= money
else:
return
if now == n:
flag = True
return
visited[now] = True # 통과할 수 있는 경우만 True 체크하기
for next in next_rooms:
if not visited[next]: # 방문하지 않은 노드 탐색하기
dfs(next, total_money)
visited[now] = False # 이번 노드를 방문하지 않는 경우, 다른 경로도 고려하기 (Back Tracking)
while True:
n = int(input())
if n == 0:
break
graph = defaultdict(list)
for i in range(n):
temp = list(input().split())
graph[i+1] = temp
visited = [False] * (n+1)
flag = False
dfs(1, 0) # start, total_money
if flag:
print("Yes")
else:
print("No")
728x90
'Algorithm (PS)' 카테고리의 다른 글
[백준] 21922번: 학부 연구생 민상 Python (0) | 2023.02.21 |
---|---|
[백준] 10159 저울 (Python/파이썬) - 플로이드워셜 (0) | 2023.02.20 |
[프로그래머스] 합승 택시 요금 Python (0) | 2023.02.18 |
[백준] 22865 가장 먼 곳 Python (0) | 2023.02.15 |
[백준] 10830번: 행렬 제곱 - Python (0) | 2023.02.11 |