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 역량테스트 준비 - 백준 알고리즘 문제
'Data Structures, Algorithm > SW 역량테스트' 카테고리의 다른 글
SW 역량테스트 - [백준] 이차원 배열과 연산 문제 풀이/해답/코드 (C++ / JAVA) (0) | 2020.10.15 |
---|---|
SW 역량테스트 - [백준] 낚시왕 문제 풀이/해답/코드 (C++ / JAVA) (0) | 2020.10.15 |
SW 역량테스트 - [백준] 아기 상어 문제 풀이/해답/코드 (C++ / JAVA) (0) | 2020.10.15 |
SW 역량테스트 - [백준] 나무 재테크 문제 풀이/해답/코드 (C++ / JAVA) (0) | 2020.10.15 |
SW 역량테스트 - [백준] 인구 이동 문제 풀이/해답/코드 (C++ / JAVA) (0) | 2020.10.15 |
Comments