Skip to content

Commit f8f92ee

Browse files
committed
[Silver II] Title: 마인크래프트, Time: 548 ms, Memory: 122000 KB -BaekjoonHub
1 parent d044a74 commit f8f92ee

File tree

2 files changed

+75
-0
lines changed

2 files changed

+75
-0
lines changed
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+
메모리: 122000 KB, 시간: 548 ms
8+
9+
### 분류
10+
11+
브루트포스 알고리즘, 구현
12+
13+
### 제출 일자
14+
15+
2025년 1월 5일 16:20:05
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+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
import sys
2+
3+
# n개의 줄에 m개의 정수로 땅 높이 주어짐
4+
# b는 인벤토리에 있는 블록의 개수
5+
# (i + 2)번째 줄의 (j + 1)번째 수는 좌표 (i, j)에서의 땅의 높이를 나타냄
6+
# 땅의 높이는 256보다 작거나 같은 자연수 또는 0
7+
# 1번 작업 : 좌표 (i, j)의 가장 위에 있는 블록을 제거하여 인벤토리에 넣는다.
8+
# 2번 작업 : 인벤토리에서 블록 하나를 꺼내어 좌표 (i, j)의 가장 위에 있는 블록 위에 놓는다.
9+
# 1번 작업은 2초가 걸리며, 2번 작업은 1초가 걸린다
10+
# 출력 : 땅을 고르는 데에 걸리는 시간과 땅의 높이
11+
n, m, b = map(int, sys.stdin.readline().split())
12+
13+
# 높이 데이터 입력
14+
gr = []
15+
for _ in range(n):
16+
gr.extend(map(int, sys.stdin.readline().split()))
17+
18+
time = [0 for i in range(257)] # time[k]에 땅높이가 k일때의 소요시간 저장
19+
height = 0
20+
for g in range(257):
21+
block = b # 인벤토리에 남은 블록 수
22+
for i in gr:
23+
if i <= g: # i == g이면 g-i=0
24+
time[g] += g - i
25+
block -= g - i
26+
else:
27+
time[g] += 2 * (i - g)
28+
block += i - g
29+
if block >= 0 and time[g] <= time[height]: # 오름차순으로 순회하므로, 답이 여러 개 있을 때 그중에서 땅의 높이가 가장 높은 것을 저장하게 됨
30+
height = g # 최소 소요 시간인 땅높이 저장
31+
32+
print(time[height], height)

0 commit comments

Comments
 (0)