득이공간

[백준 C++] 18111 마인크래프트 - 브루트포스 본문

PS/알고리즘 문제풀이

[백준 C++] 18111 마인크래프트 - 브루트포스

쟁득 2024. 2. 13. 10:26
 

18111번: 마인크래프트

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

www.acmicpc.net

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

int Height[501][501];

int main()
{
	ios::sync_with_stdio(false);
	cin.tie(NULL); cout.tie(NULL);

	int N, M, B;
	cin >> N >> M >> B;
	for (int i = 0; i < N; ++i)
	{
		for (int j = 0; j < M; ++j)
		{
			cin >> Height[i][j];
		}
	}

	int MinTime = INT_MAX;
	int SolutionHeight = 0;
	for (int TargetHeight = 0; TargetHeight < 257; ++TargetHeight)
	{
		int Time = 0;
		int Blocks = B;

		for (int i = 0; i < N; ++i)
		{
			for (int j = 0; j < M; ++j)
			{
				int CurrentHeight = Height[i][j];
				if (CurrentHeight > TargetHeight)
				{
					Blocks += (CurrentHeight - TargetHeight);
					Time += (CurrentHeight - TargetHeight) * 2;
				}
				else if (CurrentHeight < TargetHeight)
				{
					Blocks -= (TargetHeight - CurrentHeight);
					Time += (TargetHeight - CurrentHeight);
				}
			}
		}

		if (Blocks < 0)
		{
			continue;
		}

		if (Time <= MinTime)
		{
			MinTime = Time;
			SolutionHeight = TargetHeight;
		}
	}

	cout << MinTime << ' ' << SolutionHeight;
}

 

브루트포스 유형의 문제입니다.

기준 높이를 0부터 256까지 1씩 올려가면서 모든 경우의 경과 시간을 체크해주도록 풀었습니다.

그리고 각 루프에서 작업을 모두 마쳤을 때 인벤토리 블럭의 개수가 음수가 되는 경우는 체크하지 않도록 했습니다.