본문 바로가기
[백준]

[BaekJoon/백준] 17144번 미세먼지 안녕!

by Hevton 2022. 10. 10.
반응형

 

이 문제를 풀면서 느낀건, 구현문제는 확실히

print() 함수를 만들어 놓으면 편하다는 점이었다.

 

 

그리고 하나하나 코딩하면서, 찍어보면서 점점 완성시켜야지

 

확인 안하고 마지막에 다 확인하면 문제점이 언제 어디서 발생했는지 찾기 더 어려워지는 것 같다.

 

 

 

이동 방향에 대한 값을 갖고 있는 MOVE 배열을 만들어 주는 점이 중요했다.

 

그리고, memmove는 정말 자주 쓰이니까 다시 한번 외워두자!

memmove(dst, src, sizeof(src))

 

#include <iostream>
#include <vector>
#include <cstring>

using namespace std;

int MAP[50][50];

int MOVE[50][50];

int mx[5] = {0, 0, -1, 0, 1};
int my[5] = {0, 1, 0, -1, 0};

vector<pair<int, int>> ROBOTS;
int R, C, T;

void top_mapping(int x, int y) {
    
    for(int i = y + 1; i < C; i++) {
        
        MOVE[x][i] = 1; // 우 방향
    }
    
    for(int i = x; i >= 0; i--) {
        
        MOVE[i][C - 1] = 2; //  상 방향
    }
    
    for(int i = 0; i < C; i++) {
        MOVE[0][i] = 3; // 좌 방향
    }
    
    for(int i = 0; i < x; i++) {
        MOVE[i][0] = 4; // 하 방향
    }
    
}


void bottom_mapping(int x, int y) {
    
    for(int i = y + 1; i < C; i++) {
        
        MOVE[x][i] = 1; // 우 방향
    }
    
    for(int i = x; i < R; i++) {
        
        MOVE[i][C - 1] = 4; //  하 방향
    }
    
    for(int i = 0; i < C; i++) {
        MOVE[R - 1][i] = 3; // 좌 방향
    }
    
    for(int i = R - 1; i > x ; i--) {
        MOVE[i][0] = 2; // 상 방향
    }
    
}



void MOVE_MAPPING() {
    
    
    top_mapping(ROBOTS[0].first, ROBOTS[0].second);
    bottom_mapping(ROBOTS[1].first, ROBOTS[1].second);
    
//    for(int i = 0; i < R; i++) {
//        for(int j = 0; j < C; j++) {
//            cout << MOVE[i][j] << " ";
//        }
//        cout << "\n";
//    }
//
    
}

// 확산
void SPREAD() {
    
    
    int T_MAP[50][50];
    
    memset(T_MAP, 0, sizeof(T_MAP));
    
    
    for(int i = 0; i < R; i++) {
        for(int j = 0; j < C; j++) {
            
            int Cnt = 0;
            
            for(int k = 1; k <= 4; k++) {
                
                int xx = i + mx[k];
                int yy = j + my[k];
                
                
                if(xx < 0 || xx >= R || yy < 0 || yy >= C || MAP[xx][yy] == -1)
                    continue;
                
                else {
                    Cnt++;
                    T_MAP[xx][yy] += (MAP[i][j] / 5);
                }
            }
            
            T_MAP[i][j] += (MAP[i][j] - (MAP[i][j] / 5) * Cnt);
            
        }
    }
    
    memmove(MAP, T_MAP, sizeof(T_MAP)); // dst, src, size
    
}

void WIND() {
    
    int T_MAP[50][50];
    
    // 일단 MAP의 내용을 T_MAP에 복사
    memset(T_MAP, 0, sizeof(T_MAP));

    
    for(int i = 0; i < R; i++) {
        for(int j = 0; j < C; j++) {
            
            int x = i + mx[MOVE[i][j]];
            int y = j + my[MOVE[i][j]];
            
            if(MAP[x][y] == -1) { T_MAP[x][y] = -1; }
            else {
                
                T_MAP[x][y] = MAP[i][j];
                
            }
            
            
        }
    }
    
    
    memmove(MAP, T_MAP, sizeof(T_MAP));
    
}

void print() {
    
    cout << "\n";
    
    for(int i = 0; i < R; i++) {
        for(int j = 0; j < C; j++) {
            cout << MAP[i][j] << " ";
        }
        cout << "\n";
    }
}

void CALCUL() {
    
    int z = 0;
    for(int i = 0; i < R; i++) {
        for(int j = 0; j < C; j++) {
//            cout << MAP[i][j] << " ";
            z+= MAP[i][j];
        }
//        cout << "\n";
    }
    cout << z + 2 << "\n"; // -1 두개 로봇청소기꺼 뺴줌
    
}

int main() {
    
    
    cin >> R >> C >> T;
    
    for(int i = 0; i < R; i++) {
        for(int j = 0; j < C; j++) {
            
            cin >> MAP[i][j];
            
            if(MAP[i][j] == -1) {
                ROBOTS.push_back({i, j});
            }
        }
    }
    
    
    MOVE_MAPPING();
    
    
    while(T--) {
        
        SPREAD(); // 정상작동 확인완료
//        print();
        WIND();
//        print();
        
    }
    
    CALCUL();
    
    
    
}

 


21:54 ~ 22:50

반응형