KoreanFoodie's Study

SW 역량테스트 - [백준] 미세먼지 안녕! 문제 풀이/해답/코드 (C++ / JAVA) 본문

Data Structures, Algorithm/SW 역량테스트

SW 역량테스트 - [백준] 미세먼지 안녕! 문제 풀이/해답/코드 (C++ / JAVA)

GoldGiver 2020. 10. 15. 23:48


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

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

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

 


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

해답 코드 : 

 

#include <iostream>
#include <deque>
#include <vector>

using namespace std;

int M, N, T;

int map[50][50];
int change[50][50];

int u_row;
int d_row;

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

bool isRange(int r, int c) {

	if (r < 0 || r >= M || c < 0 || c >= N) {
		return false;
	}
	else {
		return true;
	}

}

void copy_map(int dst[50][50], int src[50][50], int r, int c) {
	for (int i = 0; i < r; i++) {
		for (int j = 0; j < c; j++) {
			dst[i][j] = src[i][j];
		}
	}
}


void init_map(int dst[50][50], int r, int c) {
	for (int i = 0; i < r; i++) {
		for (int j = 0; j < c; j++) {
			dst[i][j] = 0;
		}
	}
}


void disperse() {

	int t_ori;
	int t_frac;

	int n_r, n_c;

	// initialize change
	//fill(&change[0][0], &change[49][50], 0);
	init_map(change, M, N);
	
	// mark robot location
	change[u_row][0] = -1;
	change[d_row][0] = -1;

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

			if (map[i][j] > 0) {

				t_ori = map[i][j];
				t_frac = map[i][j] / 5;

				if (t_frac > 0) {
					
					for (int dir = 0; dir < 4; dir++) {

						n_r = i + dR[dir];
						n_c = j + dC[dir];

						if (isRange(n_r, n_c) && map[n_r][n_c] != -1) {
							change[n_r][n_c] += t_frac;
							t_ori -= t_frac;
						}
					}
				}
			
				change[i][j] += t_ori;
			
			}
		}
	}

	copy_map(map, change, M, N);


}

void clean() {

	// starting position
	int st_r;

	// shift : counter clockwise
	st_r = u_row;

	// down
	for (int i = st_r - 1; i > 0; i--) {
		map[i][0] = map[i - 1][0];
	}

	// left
	for (int i = 0; i < N-1; i++) {
		map[0][i] = map[0][i+1];
	}

	// up
	for (int i = 0; i < st_r; i++) {
		map[i][N - 1] = map[i + 1][N - 1];
	}

	// right
	for (int i = N-1; i > 1; i--) {
		map[st_r][i] = map[st_r][i-1];
	}
	map[st_r][1] = 0;


	// shift : clockwise
	st_r = d_row;
	
	// up
	for (int i = st_r+1; i < M-1; i++) {
		map[i][0] = map[i + 1][0];
	}

	// left
	for (int i = 0; i < N - 1; i++) {
		map[M-1][i] = map[M-1][i + 1];
	}

	// down
	for (int i = M-1; i > st_r; i--) {
		map[i][N-1] = map[i - 1][N-1];
	}

	// right
	for (int i = N - 1; i > 1; i--) {
		map[st_r][i] = map[st_r][i - 1];
	}
	map[st_r][1] = 0;

}


void simulation() {
	
	disperse();
	clean();

}


int main() {

	cin >> M >> N >> T;
	
	int ans = 0;

	u_row = -1024;

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

			cin >> map[i][j];
			if (map[i][j] == -1 && u_row < 0) {
				u_row = i;
				d_row = i+1;
			}

		}

	}


	for (int t = 0; t < T; t++) {
		simulation();
	}

	for (int i = 0; i < M; i++) {
		for (int j = 0; j < N; j++) {
	
			if (map[i][j] > 0) {
				ans += map[i][j];
			}

		}
	}


	cout << ans << endl;

}

 

 

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

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

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

 
Comments