백준(C, C++)/골드

백준 17144: 미세먼지 안녕! [C/C++], 삼성 코딩 테스트

치킨먹고싶어요 2022. 6. 13. 11:51

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

 

17144번: 미세먼지 안녕!

미세먼지를 제거하기 위해 구사과는 공기청정기를 설치하려고 한다. 공기청정기의 성능을 테스트하기 위해 구사과는 집을 크기가 R×C인 격자판으로 나타냈고, 1×1 크기의 칸으로 나눴다. 구사

www.acmicpc.net

#include <iostream>
using namespace std;
#define fastio() ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
int N, K, T, purifier, ans;
int maps[55][55];
int dy[4= {10-10};
int dx[4= {010-1};
void input();
void init();
void solve();
void move();
void purify();
int main() {
    fastio();
    input();
    solve();
    return 0;
}
void input() {
    fastio();
    cin >> N >> K >> T;
    for (int i = 1; i <= N; i++) {
        for (int j = 1; j <= K; j++) {
            cin >> maps[i][j];
            if (maps[i][j] == -1) purifier = i; // 공기청정기 위치를 알기 위해서
        }
    }
    init(); // 범위 제한을 하기 위해서
}
void init() { // 범위 제한을 하기 위해서
    for (int i = 0; i < N + 1; i++) maps[i][0= -1;
    for (int i = 0; i < N + 1; i++) maps[i][K + 1= -1;
    for (int i = 0; i < K + 1; i++) maps[0][i] = -1;
    for (int i = 0; i < K + 1; i++) maps[N + 1][i] = -1;
}
void solve() {
    while (T--) {
        move(); // 확산
        purify(); // 공기청정기
    }
    for (int i = 1; i <= N; i++) { // 결과
        for (int j = 1; j <= K; j++) {
            if (maps[i][j] != -1) ans += maps[i][j];
        }
    }
    cout << ans;
}
void move() {
    int tmp[55][55]; // 동시에 확산되기에 다 확산하고 나서 더해준다.
    for (int i = 1; i <= N; i++) { // 초기화
        for (int j = 1; j <= K; j++) {
           tmp[i][j] = 0
        }
    }
    
    for (int i = 1; i <= N; i++) {
        for (int j = 1; j <= K; j++) {
            if (0 < maps[i][j]) {
                int cnt = 0;
                for (int k = 0; k < 4; k++) {
                    if (maps[i + dy[k]][j + dx[k]] != -1) {
                        tmp[i + dy[k]][j + dx[k]] += int(maps[i][j] / 5);
                        cnt++;
                    }
                }
                tmp[i][j] -= int(maps[i][j] / 5* cnt;
            }
        }
    }
    
    for (int i = 1; i <= N; i++) {
        for (int j = 1; j <= K; j++) {
           maps[i][j] += tmp[i][j];
        }
    }
}
void purify() {
    int tmp[55][55]; // 동시에 이동하기에 tmp를 사용한다.
    for (int i = 1; i <= N; i++) { // 초기화
        for (int j = 1; j <= K; j++) {
           tmp[i][j] = 0
        }
    }
    // 공기청정기와 같은 라인
    for (int i = 2; i < K; i++) {
        tmp[purifier - 1][i + 1= maps[purifier - 1][i];
        tmp[purifier][i + 1= maps[purifier][i];
    }
    // 오른쪽 끝
    for (int i = purifier; i < N; i++) {
        tmp[i + 1][K] = maps[i][K];
    }
    for (int i = purifier - 1; i > 1; i--) {
        tmp[i - 1][K] = maps[i][K];
    }
    // 맨 밑과 맨 위
    for (int i = K; i > 1; i--) {
        tmp[1][i - 1= maps[1][i];
        tmp[N][i - 1= maps[N][i];
    }
    // 왼쪽 끝
    for (int i = 1; i < purifier; i++) {
        tmp[i + 1][1= maps[i][1];
    }
    for (int i = N; i > purifier; i--) {
        tmp[i - 1][1= maps[i][1];
    }
    
    // 복사
    for (int i = 1; i <= N; i++) {
        for (int j = 1; j <= K; j++) {
            if (i == 1 or j == 1 or i == N or j == K or i == purifier - 1 or i == purifier) {
                if (maps[i][j] != -1) maps[i][j] = tmp[i][j];
            }
        }
    }
}
 
cs

풀이:

시뮬레이션 문제입니다.