본문 바로가기
문제 풀이/백준(BOJ)

[C++] 백준 18111번 : 마인크래프트

by 희조당 2021. 8. 30.
728x90

https://www.acmicpc.net/problem/18111

 

18111번: 마인크래프트

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

www.acmicpc.net


 문제 풀이

기본적인 브루트 포스 문제이다.

기준이 되는 높이에서 걸리는 시간을 구해서 계속 비교해 가장 작은 값을 출력하면 된다.

입력받을 때 최소 높이와 최대 높이를 구해 놈으로 반복 횟수를 최소화할 수 있다.

최소가 되는 시간이 여러 경우가 있을 수 있어 그 중 가장 높은 높이일 때를 출력해야 한다.

(제거 시간 + 쌓는 시간)이 최소 시간과 같을 때도 최신화 함으로 가장 높은 높이를 출력할 수 있다!

 느낀 점

그렇게 난이도가 높지 않은 구현 문제인데 너무나 어려웠다. 구현 부분에 있어서 아직 실력이 너무 부족한 것 같다.

다시 열심히 코딩을 해야 할 것 같다.

 코드

#include <iostream>
#include <algorithm>
#include <climits>
using namespace std;

int n, m, block;
int high = -1, low = INT_MAX;
int map[501][501];
int highest = -1, time = INT_MAX;

int main() {
	ios_base::sync_with_stdio(0);
	cin.tie(0);

	cin >> n >> m >> block;
	for (int i = 0; i < n;i++) {
		for (int j = 0; j < m;j++) {
			cin >> map[i][j];
			high = max(high, map[i][j]);
			low = min(low, map[i][j]);
		}
	}

	for (int h = low; h <= high; h++) {
		int build = 0, remove = 0;
		for (int i = 0; i < n; i++) {
			for (int j = 0; j < m;j++) {
				int tmp = map[i][j] - h;
				if (tmp > 0) remove += tmp;
				else if (tmp < 0) build -= tmp;
			}
		}

		if (remove + block >= build) {
			if (time >= remove * 2 + build) {
				time = remove * 2 + build;
				highest = h;
			}
		}
	}
	cout << time << " " << highest;
}

댓글