프론트엔드 개발자 중규리 입니다 ദി ᷇ᵕ ᷆ ) 자세히보기

PS/문제풀이

백준 20208 진우의 민트초코우유 Python

중규리 2024. 2. 7. 13:08

🐸 문제 정보

 

20208번: 진우의 민트초코우유

첫번째 줄에 민초마을의 크기인 N과 진우의 초기체력 M, 그리고 민트초코우유를 마실때 마다 증가하는 체력의 양 H가 공백을 두고 주어진다. N, M, H는 모두 10보다 작거나 같은 자연수이다. 두번째

www.acmicpc.net

 

🤖 알고리즘

백트래킹

 

⏱️ 풀이 시간

32.00m

 

📝 풀이

처음에 2차원 리스트 보이자마자 BFS로 풀었다가 메모리 터지고... 백트래킹으로 풀어야한다는 것을 알게됐다.

이런 2차원 리스트 주어졌을 때 그냥 생각 안하고 BFS로 푸는 습관좀 고쳐야겠다.

 

백트래킹으로 푸는 경우 풀이는 아래와 같다.

  1. 집의 인덱스와, 민트초코 우유가 있는 인덱스 모두를 찾기
  2. 집의 인덱스부터 시작해서, 민트초코 우유의 인덱스로 하나씩 이동해보기
  3. 이때, 우유 인덱스에 도달했음에도 집으로 돌아갈 체력이 남아있다면, 현재까지 마신 우유 개수 갱신

 

🧑‍💻 나의 답

# pypy3

import sys
input = sys.stdin.readline

n, m, h = list(map(int, input().rstrip().split()))
board = [list(map(int, input().rstrip().split())) for _ in range(n)]
milks = []
hx, hy = 0, 0
res = 0

for i in range(n):
    for j in range(n):
        if board[i][j] == 1:
            hx, hy = i, j
        elif board[i][j] == 2:
            milks.append((i, j))

def bt(px, py, hp, cnt):
    global res
    for nx, ny in milks:
        if board[nx][ny] == 2:
            dist = abs(nx - px) + abs(ny - py)
            if dist <= hp:
                board[nx][ny] = 0
                bt(nx, ny, hp - dist + h, cnt + 1)
                board[nx][ny] = 2
    hdist = abs(hx - px) + abs(hy - py)
    if hdist <= hp:
        res = max(res, cnt)

bt(hx, hy, m, 0)
print(res)

'PS > 문제풀이' 카테고리의 다른 글

백준 1976 여행 가자 Python  (0) 2024.02.07
백준 16938 캠프 준비 Python  (1) 2024.02.07
백준 16960 스위치와 램프 Python  (0) 2024.02.07
백준 9935 문자열 폭발 Python  (1) 2024.02.06
백준 15961 회전 초밥 Python  (1) 2024.02.06