https://www.acmicpc.net/problem/20208
문제
진우는 민트초코우유를 좋아하는 민초단이다. 힘든 일이 있더라도 민트초코우유 하나를 마시면 기운이 펄펄 솟는다고 한다!
민트초코우유를 너무 좋아하는 나머지 진우는 매일 아침 특정 지역들에서 민트초코우유가 배달된다는 N × N 크기의 2차원 민초마을로 이사를 하였다.
진우는 아침에 눈을 뜨면 집에서 민초마을의 지도를 들고 민트초코우유를 찾으러 출발한다. 이때의 초기 체력은 M이다. 여기에서 체력은 진우가 이동할 수 있는 거리를 나타낸다. 진우는 지도상에서 상, 하, 좌, 우로 1칸씩 이동할 수 있으며 이동하면 체력이 1만큼 줄어든다. 진우가 마을을 돌아다니다가 민트초코우유를 마신다면 체력이 H 만큼 증가하며 진우의 체력이 초기체력 이상으로 올라갈 수 있다. 체력이 0이 되는 순간 진우는 이동할 수 없다.
민트초코를 찾으러 돌아다니다가 마을 한복판에서 체력이 0이 되어 집으로 못 돌아가는 상황은 만들어져서는 안된다. 진우가 얼마나 많은 민트초코우유를 마시고 집으로 돌아올 수 있는지 알아보자.
입력
첫번째 줄에 민초마을의 크기인 N과 진우의 초기체력 M, 그리고 민트초코우유를 마실때 마다 증가하는 체력의 양 H가 공백을 두고 주어진다. N, M, H는 모두 10보다 작거나 같은 자연수이다.
두번째 줄부터 N+1번째 줄에 N칸에 걸쳐서 민초마을의 지도가 주어진다. 각 칸은 공백을 두고 주어지며 지도상에서 진우의 집은 1, 민트초코우유는 2로 주어지며 빈 땅은 0으로 주어진다. 진우의 집은 무조건 한 곳이 주어지며 마을에 배달되는 민트초코우유의 총합은 10개를 넘지 않는다.
출력
진우가 집을 나와서 다시 집으로 돌아올 때 까지 마실 수 있는 민트초코우유의 최대 개수를 출력하자.
풀이
Code
import sys
input = sys.stdin.readline
# 1. 백트래킹 함수 정의
def backtracking(now, hp, count) :
global ans
# 1-1. 마실 수 있는 민트 초코 우유 개수
if count > ans :
if abs(now[0] - home[0]) + abs(now[1] - home[1]) <= hp : ans = max(ans, count)
# 1-2.
for i in range(len(mint_choco)) :
# 현재 위치에서 다음 위치까지의 거리 계산
distance = abs(now[0] - mint_choco[i][0]) + abs(now[1] - mint_choco[i][1])
# 체력이 거리보다 클 경우
if hp >= distance :
# 민트 초코 우유 리스트에서 다음 위치 제거
next = mint_choco.pop(i)
# 백트래킹 실행
backtracking(next, hp - distance + h, count + 1)
# 민트 초코 우유 리스트에서 다음 위치 삽입
mint_choco.insert(i, next)
n, m, h = map(int, input().split())
graph = [list(map(int, input().split())) for _ in range(n)]
ans = 0
# 2.
mint_choco = []
for i in range(n) :
for j in range(n) :
# 2-1. 민트 초코 우유 위치 리스트
if graph[i][j] == 2 : mint_choco.append((i,j))
# 2-2. 진우의 집 위치
elif graph[i][j] == 1 : home = (i, j)
# 3. 백트래킹 함수 실행
backtracking(home, m, 0)
# 4. 결과 출력
print(ans)
'Coding Test > Baekjoon' 카테고리의 다른 글
[Python/BOJ] 2580. 스도쿠 (1) | 2023.08.21 |
---|---|
[Python/BOJ] 16987. 계란으로 계란치기 (0) | 2023.08.20 |
[Python/BOJ] 14891. 톱니바퀴 (0) | 2023.08.20 |
[Python/BOJ] 16943. 숫자 재배치 (0) | 2023.08.19 |
[Python/BOJ] 14889. 스타트와 링크 (0) | 2023.08.19 |