-
백준_20208_진우의 민트초코우유(python)Algorithm/백준_생각정리 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(우유 - 집) 했었다. 당연히 틀렸다. 현재 내가 가고자 하는 우유가 비록 먹고나서 집으로는 못 돌아와도 다음 우유가 있는 지역들을 돌아다니다 보면 집으로 돌아올 수도 있기 때문이다. 당연한건데 흠... 아쉽다
'Algorithm > 백준_생각정리' 카테고리의 다른 글
백준_28360_양동이 게임(python) (0) 2023.07.25 백준_16568_엔비스카의 영혼 (python) (0) 2023.07.16 백준_17130_토끼가 정보섬에 올라온 이유 (python) (0) 2023.06.30 백준_22236_가희와 비행기(python) (0) 2023.06.28 백준_21773_가희와 프로세스 1(python) (0) 2023.06.23