Algorithm/백준_생각정리

백준_20208_진우의 민트초코우유(python)

코친남 2023. 7. 6. 20:58

★ 접근

문제를 보면 4방향으로 이동하면서 탐색하는 백트래킹을 떠올리기 쉽다. 하지만 n의 최대 크기가 10이고 방문했던 곳을 무한히 방문할 수 있기 때문에 백트래킹을 한다면 시간초과가 난다. 그렇다면 어떻게 해야할까? 우유가 있는 좌표를 따로 담아 놓는 백트래킹을 해야한다.

 

★ 풀이

1. 진우의 초기 좌표와 우유들이 있는 좌표를 구한다.

2. 

for i in range(len(mint)):

우유들을 처음부터 하나씩 꺼내보면서

if not visited[i]:

방문하지 않았으면서 현재 체력으로 꺼낸 우유 좌표까지 도달할 수 있다면 그 지역까지 가면서 dfs를 해주면 된다.

 

 

★ 코드

import sys
input = sys.stdin.readline
n,m,h = map(int,input().split())
data = []
mint = []
sr,sc = 0,0
for i in range(n):
    temp = list(map(int,input().split()))
    for j in range(n):
        if temp[j] == 1:
            sr,sc = i,j
        elif temp[j] == 2:
            mint.append((i,j))
    data.append(temp)
dx = [-1,1,0,0]
dy = [0,0,-1,1]
visited = [0] * len(mint)
ans = 0
def solve(x,y,hp,count):
    global ans 
    for i in range(len(mint)):
        if not visited[i]:
            temp = abs(mint[i][0] - x) + abs(mint[i][1] - y)
            if hp >= temp: 
                visited[i] = 1
                solve(mint[i][0],mint[i][1],hp-temp+h,count+1)
                visited[i] = 0
    if hp >= abs(sr-x) + abs(sc-y):
        ans = max(ans,count)

solve(sr,sc,m,0)
print(ans)

★ 회고

흠.... 처음에는 무조건 집으로 돌아야하니 현재 체력 + 회복되는 체력 >= abs(현재 좌표 - 우유) + abs(우유 - 집) 했었다. 당연히 틀렸다. 현재 내가 가고자 하는 우유가 비록 먹고나서 집으로는 못 돌아와도 다음 우유가 있는 지역들을 돌아다니다 보면 집으로 돌아올 수도 있기 때문이다. 당연한건데 흠... 아쉽다