Skip to content

Commit 3938edd

Browse files
committed
[Silver III] Title: 진우의 달 여행 (Small), Time: 108 ms, Memory: 14256 KB -BaekjoonHub
1 parent 7432761 commit 3938edd

2 files changed

Lines changed: 97 additions & 0 deletions

File tree

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
# [Silver III] 진우의 달 여행 (Small) - 17484
2+
3+
[문제 링크](https://www.acmicpc.net/problem/17484)
4+
5+
### 성능 요약
6+
7+
메모리: 14256 KB, 시간: 108 ms
8+
9+
### 분류
10+
11+
다이나믹 프로그래밍, 브루트포스 알고리즘
12+
13+
### 제출 일자
14+
15+
2026년 3월 5일 21:33:54
16+
17+
### 문제 설명
18+
19+
<p>우주비행이 꿈이였던 진우는 음식점 '매일매일싱싱'에서 열심히 일한 결과 달 여행에 필요한 자금을 모두 마련하였다! 지구와 우주사이는 N X M 행렬로 나타낼 수 있으며 각 원소의 값은 우주선이 그 공간을 지날 때 소모되는 연료의 양이다.</p>
20+
21+
<p style="text-align: center;">[예시]</p>
22+
23+
<p style="text-align: center;"><img alt="" src="https://upload.acmicpc.net/9e155c65-43ea-492b-af73-d3f9f9c9dc44/-/preview/" style="width: 150px; height: 353px;"></p>
24+
25+
<p>진우는 여행경비를 아끼기 위해 조금 특이한 우주선을 선택하였다. 진우가 선택한 우주선의 특징은 아래와 같다.</p>
26+
27+
<p><strong>1. 지구 -> 달로 가는 경우 우주선이 움직일 수 있는 방향은 아래와 같다.</strong></p>
28+
29+
<p style="text-align: center;"><img alt="" src="https://upload.acmicpc.net/8f6fc516-9870-4ef6-8474-b5d82f7b6f21/-/preview/" style="height: 200px; width: 200px;"><img alt="" src="https://upload.acmicpc.net/eb6f87f0-f4d0-43cc-8e9d-5d94bfc41936/-/preview/" style="height: 200px; width: 200px;"><img alt="" src="https://upload.acmicpc.net/e7b501aa-c92c-4a17-aed7-c7868b89af7a/-/preview/" style="height: 200px; width: 200px;"></p>
30+
31+
<p><strong>2. 우주선은 전에 움직인 방향으로 움직일 수 없다. 즉, 같은 방향으로 두번 연속으로 움직일 수 없다.</strong></p>
32+
33+
<p>진우의 목표는 <strong>연료를 최대한 아끼며 지구의 어느위치에서든 출발하여 달의 어느위치든 착륙하는 것</strong>이다.</p>
34+
35+
<p>최대한 돈을 아끼고 살아서 달에 도착하고 싶은 진우를 위해 달에 도달하기 위해 필요한 연료의 최소값을 계산해 주자.</p>
36+
37+
### 입력
38+
39+
<p>첫줄에 지구와 달 사이 공간을 나타내는 행렬의 크기를 나타내는 N, M (2≤ N, M ≤ 6)이 주어진다.</p>
40+
41+
<p>다음 N줄 동안 각 행렬의 원소 값이 주어진다. 각 행렬의 원소값은 100 이하의 자연수이다.</p>
42+
43+
### 출력
44+
45+
<p>달 여행에 필요한 최소 연료의 값을 출력한다.</p>
46+
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
import java.io.*;
2+
import java.util.*;
3+
4+
public class Main {
5+
static int [][] d = {{1, -1}, {1, 0}, {1, 1}};
6+
static int [][] map;
7+
static int m, n, ans;
8+
public static void main(String[] args) throws Exception{
9+
preSetting();
10+
for(int i = 0; i < m; i++ ){
11+
recur(-1, 0, i, map[0][i]);
12+
}
13+
System.out.println(ans);
14+
}
15+
16+
private static void recur(int preD, int x, int y, int oil){
17+
if(x == n - 1){
18+
ans = Math.min(ans, oil);
19+
return;
20+
}
21+
22+
int nX, nY;
23+
for(int i = 0; i < 3; i++){
24+
if(i == preD) continue;
25+
26+
nX = d[i][0] + x;
27+
nY = d[i][1] + y;
28+
29+
if(n < nX || m <= nY || nY < 0) continue;
30+
31+
recur(i, nX, nY, oil + map[nX][nY]);
32+
}
33+
}
34+
35+
private static void preSetting() throws Exception{
36+
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
37+
StringTokenizer st = new StringTokenizer(br.readLine());
38+
39+
n = Integer.parseInt(st.nextToken());
40+
m = Integer.parseInt(st.nextToken());
41+
42+
map = new int[n][m];
43+
ans = Integer.MAX_VALUE;
44+
for(int i = 0; i < n; i++){
45+
st = new StringTokenizer(br.readLine());
46+
for(int j = 0; j < m; j++){
47+
map[i][j] = Integer.parseInt(st.nextToken());
48+
}
49+
}
50+
}
51+
}

0 commit comments

Comments
 (0)