From 4bc7b67e1920405b4ad928b5ef5a60fc69352c55 Mon Sep 17 00:00:00 2001 From: SSUM <116950962+ssum21@users.noreply.github.com> Date: Mon, 23 Feb 2026 21:17:00 +0900 Subject: [PATCH] =?UTF-8?q?[Silver=20III]=20Title:=20=EC=A7=84=EC=9A=B0?= =?UTF-8?q?=EC=9D=98=20=EB=8B=AC=20=EC=97=AC=ED=96=89=20(Small),=20Time:?= =?UTF-8?q?=2032=20ms,=20Memory:=2032412=20KB=20-BaekjoonHub?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../17484. 진우의 달 여행 (Small)/README.md | 46 +++++++++++++++++++ .../진우의 달 여행 (Small).py | 28 +++++++++++ 2 files changed, 74 insertions(+) create mode 100644 백준/Silver/17484. 진우의 달 여행 (Small)/README.md create mode 100644 백준/Silver/17484. 진우의 달 여행 (Small)/진우의 달 여행 (Small).py 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)