본문 바로가기
CS/알고리즘

백준 16235 나무 재테크(시뮬)

by zieunee 2020. 5. 12.
반응형

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

 

16235번: 나무 재테크

부동산 투자로 억대의 돈을 번 상도는 최근 N×N 크기의 땅을 구매했다. 상도는 손쉬운 땅 관리를 위해 땅을 1×1 크기의 칸으로 나누어 놓았다. 각각의 칸은 (r, c)로 나타내며, r은 가장 위에서부터 떨어진 칸의 개수, c는 가장 왼쪽으로부터 떨어진 칸의 개수이다. r과 c는 1부터 시작한다. 상도는 전자통신공학과 출신답게 땅의 양분을 조사하는 로봇 S2D2를 만들었다. S2D2는 1×1 크기의 칸에 들어있는 양분을 조사해 상도에게 전송하고, 모든

www.acmicpc.net

 

완전 시뮬레이션 .. 

 

처음에는 죽는 나무들을 모두 vector erase를 해줬는데..  계속안되고 오류났는데 이유가 

총 배열이 2인 vector 에서 v[2]를 지워주면 v[3]였는애는 v[2] 이 되므로 3번째 자리에 있는 아이를 를 지우려할때 값이 없어서 오류가 난다.

디버깅.. 힘들었다 erase 잘써야 하는 것...

 

그래서 vSummer의 값에 들어가는 v의n번째에 있는 값 (vSummer의 4번째수) 을 sort해서 큰 수 부터 지운다면 오류가 안나겠지? 했지만 .. 시간초과 

 

그래서 아예 나무가 있는값을 함수 들어갈때마다 초기화하는 vv에 넣어주고 v로 엎어치기 하는 소스를 넣었더니 시간초과가 안났다. 

sort... 자주 쓰지 말아야겠다... 

 

매우 구린 소스지만 귀찮아서 수정을 안하고 올린다....

//나무재테크 
#include<iostream>
#include<string.h>
#include<algorithm>
#include<vector>
#include <functional>
using namespace std;
int N, M, K , x, y, z;
int map[11][11];
int food[11][11];
vector <int > v[11][11];
vector <pair<pair<int, int>,pair<int, int>>> vSummer;
vector <pair<int, int>> vFall;

//bool cmp(const pair<pair<int, int>, pair<int, int>>& a, const pair<pair<int, int>, pair<int, int>> & b)
//{
//	return a.second.second > b.second.second;
//}

void solve() {
	//봄 
	vector <int > vv[11][11];

	for (int i = 1; i <= N; i++) {
		for (int j = 1; j <= N; j++) {
			//int vsize = v[i][j].size();
				//나무
			for (int zz = 0; zz < v[i][j].size(); zz++) {
				if (v[i][j][zz] <= map[i][j]) {
					//영양제 냠
					map[i][j] = map[i][j] - v[i][j][zz];
					v[i][j][zz] = v[i][j][zz] + 1;
					vv[i][j].push_back(v[i][j][zz]);

					if (v[i][j][zz] % 5 == 0 ) {
						vFall.push_back({ i,j });
					}

				}
				else {
					//죽음
					vSummer.push_back({ {i,j},{v[i][j][zz],zz} });
				}
			}

		}
	}

	//여름 
	if (vSummer.size() != 0) {
	//	sort(vSummer.begin(), vSummer.end(), cmp);
		for (int i = 0; i < vSummer.size(); i++) {
			int nx = vSummer[i].first.first;
			int ny = vSummer[i].first.second;
			int nz = vSummer[i].second.first;
			int zz = vSummer[i].second.second;
			map[nx][ny] += (nz/2);
			
			//v[nx][ny].erase(v[nx][ny].begin() + zz);

		}
	}


	//가을 
	if (vFall.size() != 0) {
		for (int i = 0; i < vFall.size(); i++) {
			int nx = vFall[i].first;
			int ny = vFall[i].second;

			if (nx - 1 > 0) vv[nx - 1][ny].push_back(1);			
			if (ny - 1 > 0)  vv[nx][ny - 1].push_back(1);
			if (nx + 1 <= N) vv[nx + 1][ny].push_back(1);
			if (ny + 1 <= N) vv[nx][ny + 1].push_back(1);
			if (nx - 1 > 0 && ny - 1 > 0) vv[nx - 1][ny - 1].push_back(1);
			if (nx - 1 > 0 && ny + 1 <= N) vv[nx - 1][ny + 1].push_back(1);
			if (nx + 1 <= N && ny - 1 > 0) vv[nx + 1][ny - 1].push_back(1);
			if (nx + 1 <= N && ny + 1 <= N)	vv[nx + 1][ny + 1].push_back(1);
		}

	}

	//겨울 

	for (int i = 1; i <= N; i++) {
		for (int j = 1; j <= N; j++) {
			map[i][j] += food[i][j];
		}
	}

	vSummer.clear();
	vFall.clear();
	for (int i = 1; i <= N; i++) {
		for (int j = 1; j <= N; j++) {
			v[i][j].clear();
			for (int z = 0; z < vv[i][j].size(); z++) {
				v[i][j].push_back(vv[i][j][z]);
			}
		}
	}


}
int main() {
	scanf("%d%d%d", &N, &M, &K);//111
	for (int i = 1; i <= N; i++) {
		for (int j = 1; j <= N; j++) {
			scanf("%d", &food[i][j]);
			map[i][j] = 5;
		}
	}


;	for (int i = 1; i <= M; i++) {
		scanf("%d%d%d", &x, &y, &z);
		v[x][y].push_back(z);
	}

	while(K--){

		for (int i = 1; i <= N; i++) {
			for (int j = 1; j <= N; j++) {
				if (v[i][j].size() > 1) {
					sort(v[i][j].begin(), v[i][j].end());
				}
			}
		}
		solve();

	}

	int cnt = 0;

	for (int i = 1; i <= N; i++) {
		for (int j = 1; j <= N; j++) {
			if(v[i][j].size() != 0) cnt += v[i][j].size();
			
		}
	}

	printf("%d", cnt);
}

 

반응형