PS

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

왕방토 2021. 3. 4. 00:33
728x90

실버 Ⅲ

 

#include <iostream>
#include <vector>
#include <utility>

using namespace std;

vector <vector<int>> world;
int N, M, B;

int main() {
	scanf("%d%d%d", &N, &M, &B);

	int tmp;
	int mi = 501;
	int ma = -1;

	world.resize(N, vector<int>(M));
	for (int i = 0; i < N; i++) {
		for (int j = 0; j < M; j++) {
			scanf("%d", &tmp);
			world[i][j] = tmp;
			if (tmp < mi) mi = tmp;
			if (tmp > ma) ma = tmp;
		}
	}

	vector <pair<int, int>> times;
	for (int level = mi; level <= ma; level++) {

		int t = 0;
		int needed = 0;
		int got = B;

		for (int i = 0; i < N; i++) {
			for (int j = 0; j < M; j++) {

				if (world[i][j] > level) {
					t += (world[i][j] - level) * 2;
					got += (world[i][j] - level);
				}
				else if (world[i][j] < level) {
					t += (level - world[i][j]);
					needed += (level - world[i][j]);
				}
			}
		}
		if (got >= needed) times.push_back({level, t});
	}
	
	int ans = times.front().second;
	int idx = 0;

	for (int i = 0; i < times.size(); i++) {
		if (times[i].second < ans) {
			ans = times[i].second;
			idx = times[i].first;
		}
		else if (times[i].second == ans && idx < times[i].first) idx = times[i].first;
	}


	printf("%d %d", ans, idx);
}

 

 

맨 마지막의 for문에서

조금 단순하게 해 본다고 이렇게 했었다

 

	//level이 높은 경우가 우선시 되도록 times의 벡터 뒷부분부터 탐색을 시작한다

	for (int i = times.size() - 1; i >= 0; i--) {
		if (times[i].second < ans) {
			ans = times[i].second;
			idx = times[i].first;
		}
	}

 

이랬더니 틀렸습니다가 떠서.. 코드를 아무리 뜯어봐도 틀릴 부분이 여기밖에 없길래 설마 하고 고쳤더니 맞았다

아직도 왜인지는 모름.. 무슨 반례가 있을까?

 

아 그리고 엄청난 사실이 하나 있는데

사실 이차원 벡터를 만들지 않아도 된다

 

문제를 풀 때 이차원인 성질을 전혀 활용하지 않기 때문에...(필요 없다)

그냥 높이들의 정보를 저장할 집합을 하나 만들어 주면 된다

 

문제 푸는데 필요한 알고리즘은.. 브루트 포스다

 

암튼 이 문제로 2 클래스 40문제인가 다 풀어서 ++을 달았다

2++ 다는 것보다 그냥 클래스 3을 다는 게 공부에는 효과가 더 좋겠지만..

애초에 이것도 강의 안 듣고 하는 거라 클래스 3 풀려면 너무 오래 걸려서 학업에 지장을 준다ㅋㅋ

이제 클래스 3 풀어야 하는데 이건 그 주에 필요한 과제 다 미리 하고 공부까지 미리 해 놓으면 하도록 하자

이렇게 안 해놓으면 맨날 천날 백준 붙들고 있을 듯...ㅋㅋ

 

 

( + ㅋㅋㅋ 사실은 백준 레이팅 시스템이 바뀌어서 class 2++로 올라가면 점수 좀 오르려나 하고 한 거긴 한데

클래스 점수는 2나 2+이나 2++이나 똑같다ㅋㅋ꼼수부렸는데 안 통했네~~~ 아코~~)