백준 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 |
댓글()