Skip to content

Commit a86cfc6

Browse files
committed
[Silver II] Title: 마인크래프트, Time: 728 ms, Memory: 36640 KB -BaekjoonHub
1 parent 700ef48 commit a86cfc6

File tree

2 files changed

+102
-0
lines changed

2 files changed

+102
-0
lines changed
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
# [Silver II] 마인크래프트 - 18111
2+
3+
[문제 링크](https://www.acmicpc.net/problem/18111)
4+
5+
### 성능 요약
6+
7+
메모리: 36640 KB, 시간: 728 ms
8+
9+
### 분류
10+
11+
브루트포스 알고리즘, 구현
12+
13+
### 제출 일자
14+
15+
2024년 11월 25일 12:59:56
16+
17+
### 문제 설명
18+
19+
<p>팀 레드시프트는 대회 준비를 하다가 지루해져서 샌드박스 게임인 ‘마인크래프트’를 켰다. 마인크래프트는 1 × 1 × 1(세로, 가로, 높이) 크기의 블록들로 이루어진 3차원 세계에서 자유롭게 땅을 파거나 집을 지을 수 있는 게임이다.</p>
20+
21+
<p>목재를 충분히 모은 lvalue는 집을 짓기로 하였다. 하지만 고르지 않은 땅에는 집을 지을 수 없기 때문에 땅의 높이를 모두 동일하게 만드는 ‘땅 고르기’ 작업을 해야 한다.</p>
22+
23+
<p>lvalue는 세로 <em>N</em>, 가로 <em>M</em> 크기의 집터를 골랐다. 집터 맨 왼쪽 위의 좌표는 (0, 0)이다. 우리의 목적은 이 집터 내의 땅의 높이를 일정하게 바꾸는 것이다. 우리는 다음과 같은 두 종류의 작업을 할 수 있다.</p>
24+
25+
<ol>
26+
<li>좌표 (<em>i</em>, <em>j</em>)의 가장 위에 있는 블록을 제거하여 인벤토리에 넣는다.</li>
27+
<li>인벤토리에서 블록 하나를 꺼내어 좌표 (<em>i</em>, <em>j</em>)의 가장 위에 있는 블록 위에 놓는다.</li>
28+
</ol>
29+
30+
<p>1번 작업은 2초가 걸리며, 2번 작업은 1초가 걸린다. 밤에는 무서운 몬스터들이 나오기 때문에 최대한 빨리 땅 고르기 작업을 마쳐야 한다. ‘땅 고르기’ 작업에 걸리는 최소 시간과 그 경우 땅의 높이를 출력하시오.</p>
31+
32+
<p>단, 집터 아래에 동굴 등 빈 공간은 존재하지 않으며, 집터 바깥에서 블록을 가져올 수 없다. 또한, 작업을 시작할 때 인벤토리에는 <em>B</em>개의 블록이 들어 있다. 땅의 높이는 256블록을 초과할 수 없으며, 음수가 될 수 없다.</p>
33+
34+
### 입력
35+
36+
<p>첫째 줄에 <i>N, M</i>, <em>B</em>가 주어진다. (1 ≤ <em>M</em>, <em>N</em> ≤ 500, 0 ≤ <em>B</em> ≤ 6.4 × 10<sup>7</sup>)</p>
37+
38+
<p>둘째 줄부터 <i>N</i>개의 줄에 각각 <i>M</i>개의 정수로 땅의 높이가 주어진다. (<em>i </em>+ 2)번째 줄의 (<em>j </em>+ 1)번째 수는 좌표 (<em>i</em>,<em> j</em>)에서의 땅의 높이를 나타낸다. 땅의 높이는 256보다 작거나 같은 자연수 또는 0이다.</p>
39+
40+
### 출력
41+
42+
<p>첫째 줄에 땅을 고르는 데 걸리는 시간과 땅의 높이를 출력하시오. 답이 여러 개 있다면 그중에서 땅의 높이가 가장 높은 것을 출력하시오.</p>
43+
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
import java.io.*;
2+
import java.util.*;
3+
4+
public class Main {
5+
public static void main(String[] args) throws IOException {
6+
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
7+
StringTokenizer st = new StringTokenizer(br.readLine());
8+
9+
int N = Integer.parseInt(st.nextToken());
10+
int M = Integer.parseInt(st.nextToken());
11+
int B = Integer.parseInt(st.nextToken());
12+
13+
int[][] ground = new int[N][M];
14+
int minHeight = 256;
15+
int maxHeight = 0;
16+
17+
// 입력받으면서 최소, 최대 높이 계산
18+
for(int i = 0; i < N; i++) {
19+
st = new StringTokenizer(br.readLine());
20+
for(int j = 0; j < M; j++) {
21+
ground[i][j] = Integer.parseInt(st.nextToken());
22+
minHeight = Math.min(minHeight, ground[i][j]);
23+
maxHeight = Math.max(maxHeight, ground[i][j]);
24+
}
25+
}
26+
27+
int answerTime = Integer.MAX_VALUE;
28+
int answerHeight = 0;
29+
30+
for(int height = minHeight; height <= maxHeight; height++) {
31+
int time = 0;
32+
int inventory = B;
33+
34+
for(int i = 0; i < N; i++) {
35+
for(int j = 0; j < M; j++) {
36+
int diff = ground[i][j] - height;
37+
38+
if(diff > 0) {
39+
time += diff * 2;
40+
inventory += diff;
41+
} else if(diff < 0) {
42+
time += Math.abs(diff);
43+
inventory -= Math.abs(diff);
44+
}
45+
}
46+
}
47+
48+
49+
if(inventory >= 0) {
50+
if(time <= answerTime) {
51+
answerTime = time;
52+
answerHeight = height;
53+
}
54+
}
55+
}
56+
57+
System.out.println(answerTime + " " + answerHeight);
58+
}
59+
}

0 commit comments

Comments
 (0)