백준 18111번에 해당하는 글 1

백준 18111 - 마인크래프트(C++)

CodingTest/백준|2022. 6. 2. 14:12

 

먼저 B의 값을 보고 long long으로 타입 지정을 결정했고

감이 잘 안와 시간이 오래 걸렸다.

 

배열의 최대값에서부터 내려가며 검사 후 인벤과 비교하며 수행하려니

너무 복잡한 코드가 나올 것 같아 패스하였고

 

그렇다고 0부터 최대 높이인 256까지 검사를 진행하면 너무 많은 시간이 소비될 것 같아

1차 배열의 각 높이를 Count하고 0부터 256까지 257번의 계산을 수행하여 계산을 진행하였다.

이렇게 하면 0부터 시작하여 O(n^3)이 아닌 O(n^2)으로 계산을 할 수 있어 진행을 하였다.

 

int main()
{
	vector<int> vMap;
	cin >> iCol >> iRow >> iInven;
	vMap.assign(MAX_HEIGHT, 0);
	int iHight = 0;
	for (int i = 0; i < iCol; i++)
	{
		for (int j = 0; j < iRow; j++)
		{
			cin >> iHight;
			vMap[iHight]++;
		}
	}
	for (int z = 0; z < MAX_HEIGHT; z++)
		SearchMap(vMap, z);
	cout << iDstT << " " << iDstH << "\n";
	return 0;
}

 

먼저 vMap을 MAX_HEIGHT(257)개의 배열로 초기화를 수행 후 각각의 입력된 값을 높이에 저장하여

Hash와 비슷하게 구현을 하였고 MAX_HEIGHT만큼의 SerachMap을 수행하여 계산을 하였다.

 

void SearchMap(const vector<int>& vMap, int iDstHeight)
{
	int iPushCnt = 0, iPopCnt = 0;
	for (int i = 0; i < iDstHeight; i++)	//목표 높이보다 낮으니 추가
		iPushCnt += (iDstHeight - i) * vMap[i];

	for (int i = iDstHeight + 1; i < MAX_HEIGHT; i++ )	//목표 높이보다 높으니 차감
		iPopCnt += (i - iDstHeight) * vMap[i];

	if (iPushCnt <= iInven + iPopCnt)
	{
		if (iDstT >= (iPushCnt + (iPopCnt * 2)))
		{
			iDstT = (iPushCnt + (iPopCnt * 2));
			iDstH = iDstHeight;
		}
	}
}

 

SearchMap은 반복문으로 들어오는 목표 높이를 기준으로

목표 높이보다 낮거나 높을때를 Count하여 인벤과 비교하여 현재 높이가 성립이 되고

이미 구해진 최단시간보다 작으면 갱신을 하였다.

 

아래는 전체 코드이다.

 

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

int MAX_HEIGHT = 257;
long long iCol = 0, iRow = 0, iMin = 0, iMax = 0, iInven = 0;
long long iDstT = INT_MAX, iDstH = 0;

void SearchMap(const vector<int>& vMap, int iDstHeight)
{
	int iPushCnt = 0, iPopCnt = 0;
	for (int i = 0; i < iDstHeight; i++)	//목표 높이보다 낮으니 추가
		iPushCnt += (iDstHeight - i) * vMap[i];

	for (int i = iDstHeight + 1; i < MAX_HEIGHT; i++ )	//목표 높이보다 높으니 차감
		iPopCnt += (i - iDstHeight) * vMap[i];

	if (iPushCnt <= iInven + iPopCnt)
	{
		if (iDstT >= (iPushCnt + (iPopCnt * 2)))
		{
			iDstT = (iPushCnt + (iPopCnt * 2));
			iDstH = iDstHeight;
		}
	}
}

int main()
{
	vector<int> vMap;
	cin >> iCol >> iRow >> iInven;
	vMap.assign(MAX_HEIGHT, 0);
	int iHight = 0;
	for (int i = 0; i < iCol; i++)
	{
		for (int j = 0; j < iRow; j++)
		{
			cin >> iHight;
			vMap[iHight]++;
		}
	}
	for (int z = 0; z < MAX_HEIGHT; z++)
		SearchMap(vMap, z);
	cout << iDstT << " " << iDstH << "\n";
	return 0;
}

'CodingTest > 백준' 카테고리의 다른 글

백준 1774 - 듣보잡(C++)  (0) 2022.06.02
백준 18870 - 좌표 압축(C++)  (0) 2022.06.02
백준 17219 - 비밀번호 찾기(C++)  (0) 2022.06.02
백준 2108 - 통계학(C++)  (0) 2022.05.31
백준 2805 - 나무 자르기(C++)  (0) 2022.05.31

댓글()