Skip to content

Commit

Permalink
[Silver II] Title: 마인크래프트, Time: 212 ms, Memory: 31120 KB -BaekjoonHub
Browse files Browse the repository at this point in the history
  • Loading branch information
srlee056 committed Mar 30, 2024
1 parent 950cb76 commit 6627118
Show file tree
Hide file tree
Showing 2 changed files with 93 additions and 0 deletions.
43 changes: 43 additions & 0 deletions 백준/Silver/18111. 마인크래프트/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
# [Silver II] 마인크래프트 - 18111

[문제 링크](https://www.acmicpc.net/problem/18111)

### 성능 요약

메모리: 31120 KB, 시간: 212 ms

### 분류

브루트포스 알고리즘, 구현

### 제출 일자

2024년 3월 30일 23:12:00

### 문제 설명

<p>팀 레드시프트는 대회 준비를 하다가 지루해져서 샌드박스 게임인 ‘마인크래프트’를 켰다. 마인크래프트는 1 × 1 × 1(세로, 가로, 높이) 크기의 블록들로 이루어진 3차원 세계에서 자유롭게 땅을 파거나 집을 지을 수 있는 게임이다.</p>

<p>목재를 충분히 모은 lvalue는 집을 짓기로 하였다. 하지만 고르지 않은 땅에는 집을 지을 수 없기 때문에 땅의 높이를 모두 동일하게 만드는 ‘땅 고르기’ 작업을 해야 한다.</p>

<p>lvalue는 세로 <em>N</em>, 가로 <em>M</em> 크기의 집터를 골랐다. 집터 맨 왼쪽 위의 좌표는 (0, 0)이다. 우리의 목적은 이 집터 내의 땅의 높이를 일정하게 바꾸는 것이다. 우리는 다음과 같은 두 종류의 작업을 할 수 있다.</p>

<ol>
<li>좌표 (<em>i</em>, <em>j</em>)의 가장 위에 있는 블록을 제거하여 인벤토리에 넣는다.</li>
<li>인벤토리에서 블록 하나를 꺼내어 좌표 (<em>i</em>, <em>j</em>)의 가장 위에 있는 블록 위에 놓는다.</li>
</ol>

<p>1번 작업은 2초가 걸리며, 2번 작업은 1초가 걸린다. 밤에는 무서운 몬스터들이 나오기 때문에 최대한 빨리 땅 고르기 작업을 마쳐야 한다. ‘땅 고르기’ 작업에 걸리는 최소 시간과 그 경우 땅의 높이를 출력하시오.</p>

<p>단, 집터 아래에 동굴 등 빈 공간은 존재하지 않으며, 집터 바깥에서 블록을 가져올 수 없다. 또한, 작업을 시작할 때 인벤토리에는 <em>B</em>개의 블록이 들어 있다. 땅의 높이는 256블록을 초과할 수 없으며, 음수가 될 수 없다.</p>

### 입력

<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>

<p>둘째 줄부터 <i>N</i>개의 줄에 각각 <i>M</i>개의 정수로 땅의 높이가 주어진다. (<em>i </em>+ 2)번째 줄의 (<em>j </em>+ 1)번째 수는 좌표 (<em>i</em>,<em> j</em>)에서의 땅의 높이를 나타낸다. 땅의 높이는 256보다 작거나 같은 자연수 또는 0이다.</p>

### 출력

<p>첫째 줄에 땅을 고르는 데 걸리는 시간과 땅의 높이를 출력하시오. 답이 여러 개 있다면 그중에서 땅의 높이가 가장 높은 것을 출력하시오.</p>

50 changes: 50 additions & 0 deletions 백준/Silver/18111. 마인크래프트/마인크래프트.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
from sys import stdin

N, M, B = map(int, stdin.readline().split())

heights = [0] * 257
total_sum = 0

min_v, max_v = 256, 0
for _ in range(N):
row = list(map(int, stdin.readline().split()))
for value in row:
heights[value] += 1
min_v = min(min_v, value)
max_v = max(max_v, value)
# print(heights)
acm_counts = [0] * 257
acm_counts[0] = heights[0]
for i in range(1, 257):
acm_counts[i] = acm_counts[i - 1] + heights[i]
for i in range(1, 257):
acm_counts[i] += acm_counts[i - 1]
# print(acm_counts)

acm_counts_rev = [0] * 257
acm_counts_rev[256] = heights[256]
for i in range(255, -1, -1):
acm_counts_rev[i] = acm_counts_rev[i + 1] + heights[i]
for i in range(255, -1, -1):
acm_counts_rev[i] += acm_counts_rev[i + 1]

# print(acm_counts_rev)
min_time = -1
min_time_h = 0
for k in range(min_v, max_v + 1):
total_time = 0
total_block = 0
if k > 0:
total_time += acm_counts[k - 1]
total_block += acm_counts[k - 1]
if k < 256:
total_time += acm_counts_rev[k + 1] * 2
total_block -= acm_counts_rev[k + 1]

# print(total_time, total_block)
if total_block <= B:
if min_time == -1 or min_time >= total_time:
min_time = total_time
min_time_h = k

print(min_time, min_time_h)

0 comments on commit 6627118

Please sign in to comment.