diff --git a/백준/Silver/17484. 진우의 달 여행 (Small)/README.md b/백준/Silver/17484. 진우의 달 여행 (Small)/README.md new file mode 100644 index 0000000..e21397a --- /dev/null +++ b/백준/Silver/17484. 진우의 달 여행 (Small)/README.md @@ -0,0 +1,46 @@ +# [Silver III] 진우의 달 여행 (Small) - 17484 + +[문제 링크](https://www.acmicpc.net/problem/17484) + +### 성능 요약 + +메모리: 32412 KB, 시간: 32 ms + +### 분류 + +다이나믹 프로그래밍, 브루트포스 알고리즘 + +### 제출 일자 + +2026년 2월 23일 21:16:40 + +### 문제 설명 + +
우주비행이 꿈이였던 진우는 음식점 '매일매일싱싱'에서 열심히 일한 결과 달 여행에 필요한 자금을 모두 마련하였다! 지구와 우주사이는 N X M 행렬로 나타낼 수 있으며 각 원소의 값은 우주선이 그 공간을 지날 때 소모되는 연료의 양이다.
+ +[예시]
+ +진우는 여행경비를 아끼기 위해 조금 특이한 우주선을 선택하였다. 진우가 선택한 우주선의 특징은 아래와 같다.
+ +1. 지구 -> 달로 가는 경우 우주선이 움직일 수 있는 방향은 아래와 같다.
+ +2. 우주선은 전에 움직인 방향으로 움직일 수 없다. 즉, 같은 방향으로 두번 연속으로 움직일 수 없다.
+ +진우의 목표는 연료를 최대한 아끼며 지구의 어느위치에서든 출발하여 달의 어느위치든 착륙하는 것이다.
+ +최대한 돈을 아끼고 살아서 달에 도착하고 싶은 진우를 위해 달에 도달하기 위해 필요한 연료의 최소값을 계산해 주자.
+ +### 입력 + +첫줄에 지구와 달 사이 공간을 나타내는 행렬의 크기를 나타내는 N, M (2≤ N, M ≤ 6)이 주어진다.
+ +다음 N줄 동안 각 행렬의 원소 값이 주어진다. 각 행렬의 원소값은 100 이하의 자연수이다.
+ +### 출력 + +달 여행에 필요한 최소 연료의 값을 출력한다.
+ diff --git a/백준/Silver/17484. 진우의 달 여행 (Small)/진우의 달 여행 (Small).py b/백준/Silver/17484. 진우의 달 여행 (Small)/진우의 달 여행 (Small).py new file mode 100644 index 0000000..1fa1c91 --- /dev/null +++ b/백준/Silver/17484. 진우의 달 여행 (Small)/진우의 달 여행 (Small).py @@ -0,0 +1,28 @@ +import sys + +input = sys.stdin.readline +N, M = map(int, input().split()) +a = [list(map(int, input().split())) for _ in range(N)] + +INF = sys.maxsize +delta = [-1, 0, 1] # d=0 left-down, d=1 down, d=2 right-down + +dp = [[[INF]*3 for _ in range(M)] for _ in range(N)] + +for j in range(M): + for d in range(3): + dp[0][j][d] = a[0][j] + +for i in range(1, N): + for j in range(M): + for d in range(3): + pj = j - delta[d] + if 0 <= pj < M: + best_prev = INF + for pd in range(3): + if pd != d: + best_prev = min(best_prev, dp[i-1][pj][pd]) + dp[i][j][d] = a[i][j] + best_prev + +ans = min(dp[N-1][j][d] for j in range(M) for d in range(3)) +print(ans)