KoreanFoodie's Study

SW 역량테스트 - [백준] 나무 재테크 문제 풀이/해답/코드 (C++ / JAVA) 본문

Data Structures, Algorithm/SW 역량테스트

SW 역량테스트 - [백준] 나무 재테크 문제 풀이/해답/코드 (C++ / JAVA)

GoldGiver 2020. 10. 15. 23:46


SW 역량 테스트 준비를 위한 핵심 문제들을 다룹니다!

해답을 보기 전에 문제를 풀어보시거나, 설계를 하고 오시는 것을 추천드립니다. 

코드에 대한 설명은 주석을 참고해 주세요 :)

 


문제 링크 : www.acmicpc.net/problem/16235

해답 코드 : 

 

#include <iostream>
#include <deque>
#include <algorithm>

using namespace std;

int N, M, K;

// number of fertilizer in the cell
int map[10][10];

int A[10][10];

deque<int> trees[10][10];

int ans;

int dR[8] = {-1, -1, -1, 0, 0, 1, 1, 1};
int dC[8] = {-1, 0, 1, -1, 1, -1, 0, 1};

bool isRange(int row, int col) {

	if (row < 0 || row >= N || col < 0 || col >= N) {
		return false;
	}
	else return true;

}

deque<int> push_in_sorted(deque<int> test, int input) {

	int cur_val;
	deque<int> temp;

	if (test.empty()) {
		test.push_back(input);
		return test;
	}
	else {

		for (int i = 0; i < test.size(); i++) {
			
			cur_val = test[i];
			
			if (cur_val < input) {
				continue;
			}
			else {
				test.insert(test.begin() + i, input);
				return test;
			}
		}
	}
}


void spring_summer() {

	deque<int> alive;
	deque<int> dead;

	// spring
	for (int i = 0; i < N; i++) {

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

			if (!trees[i][j].empty()) {

				for (int num = 0; num < trees[i][j].size(); num++) {

					// eat nutrient
					if (map[i][j] >= trees[i][j][num]) {
 						map[i][j] -= trees[i][j][num];
						trees[i][j][num]++;
						//temp = push_in_sorted(temp, trees[i][j][num]);
						//temp.push_back(trees[i][j][num]);
						alive.push_back(trees[i][j][num]);
					}
					// impossible to eat nutrient
					// summer 1 (dead trees)
					else {
						dead.push_front(trees[i][j][num]);
					}

				}

				// spring + summer 2 -> update dead trees
				(trees[i][j]).clear();

				for (int num = 0; num < alive.size(); num++) {
					(trees[i][j]).push_back(alive[num]);
				}
				//copy(temp.begin(), temp.end(), trees[i][j]);
				alive.clear();

				// add nutrients
				for (int num = 0; num < dead.size(); num++) {
					map[i][j] += (dead[num] / 2);
				}
				dead.clear();

			}


		}

	}

}

void fall() {

	int n_r, n_c;

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

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

			for (int num = 0; num < trees[i][j].size(); num++) {

				if (trees[i][j][num] % 5 == 0) {

					for (int dir = 0; dir < 8; dir++) {
						n_r = i + dR[dir];
						n_c = j + dC[dir];

						if (isRange(n_r, n_c)) {
							trees[n_r][n_c].push_front(1);
						}
					}
				}

			}

		}
	}

}

void winter() {

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

}


int main() {

	fill(&map[0][0], &map[9][10], 5);

	int t_r, t_c, t_a;

	ans = 0;

	cin >> N >> M >> K;

	for (int i = 0; i < N; i++) {
		for (int j = 0; j < N; j++) {
			cin >> A[i][j];
		}
	}

	for (int i = 0; i < M; i++) {
		cin >> t_r >> t_c >> t_a;
		trees[t_r - 1][t_c - 1].push_back(t_a);
	}

	for (int i = 0; i < K; i++) {
		spring_summer();
		fall();
		winter();
	}

	for (int i = 0; i < N; i++) {
		for (int j = 0; j < N; j++) {
			ans += trees[i][j].size();
		}
	}

	cout << ans << endl;
};

 

 

SW 역량테스트 준비 - [모의 SW 역량테스트] 풀이 / 코드 / 답안 (C++ / JAVA)

SW 역량테스트 준비 - C++ 코드, Java 코드

SW 역량테스트 준비 - 백준 알고리즘 문제

 
Comments