https://www.acmicpc.net/problem/17484
📝 문제
지구와 우주사이는 N X M 행렬로 나타낼 수 있으며 각 원소의 값은 우주선이 그 공간을 지날 때 소모되는 연료의 양이다.
진우는 여행경비를 아끼기 위해 조금 특이한 우주선을 선택하였다. 진우가 선택한 우주선의 특징은 아래와 같다.
- 지구 -> 달로 가는 경우 우주선이 움직일 수 있는 방향은 아래로 3방향.
- 우주선은 전에 움직인 방향으로 움직일 수 없다. 즉, 같은 방향으로 두번 연속으로 움직일 수 없다.
진우의 목표는 연료를 최대한 아끼며 지구의 어느위치에서든 출발하여 달의 어느위치든 착륙하는 것이다.
최대한 돈을 아끼고 살아서 달에 도착하고 싶은 진우를 위해 달에 도달하기 위해 필요한 연료의 최소값을 계산해 주자.
⌨️ 입력
첫줄에 지구와 달 사이 공간을 나타내는 행렬의 크기를 나타내는 N, M (2≤ N, M ≤ 6)이 주어진다.
다음 N줄 동안 각 행렬의 원소 값이 주어진다. 각 행렬의 원소값은 100 이하의 자연수이다.
🖥️ 출력
달 여행에 필요한 최소 연료의 값을 출력한다.
💡 아이디어
DFS 기반 백트래킹
🧑🏻💻 Code
def backtracking(cost, row, col, before):
global res
if row == N: # 도착했나요?
res = cost
return
cost += matrix[row][col]
if res and res < cost: # 이전 결과보다 값이 커졌나요?
return
for i in range(col-1, col+2):
if i - col == before: # 혹시 이전행동을 반복하려 하지 않나요?
continue
if 0 <= i < M:
backtracking(cost, row+1, i, i - col) # 째귀
if __name__ == "__main__":
N, M = map(int, input().split())
matrix = [list(map(int, input().split())) for _ in range(N)]
res = 0
for i in range(M):
backtracking(0, 0, i, 2)
print(res)
💬 소감
코테의 꽃 백트래킹!
'Python > 알고리즘' 카테고리의 다른 글
[알고리즘] 백준 3758번: KCPC (0) | 2024.04.16 |
---|---|
[알고리즘] 백준 2607번: 비슷한 단어 (0) | 2024.04.16 |
[알고리즘] 백준 19941번: 햄버거 분배 (0) | 2024.04.13 |
[알고리즘] 백준 1515번: 수 이어 쓰기 (0) | 2024.04.11 |
[알고리즘] 백준 21921번: 블로그 (0) | 2024.04.10 |
댓글