인프런 커뮤니티 질문&답변

bunny님의 프로필 이미지
bunny

작성한 질문수

10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트

17144 미세먼지 문제 질문

작성

·

138

0

http://boj.kr/e2b03ab6671048c69e3ec52622d773a3

안녕하세요 17144 미세먼지 문제 풀다가 질문 생겨서 글 올립니다.

저는 위와 같이 작성했습니다.

예제 1번에 대한 답은 공기 청정기가 작동한 후와 동일하게 나오는데

예제 2번 부터 틀립니다.

제가 놓친 부분은 어떤 것이 있을까요?

답변 2

0

bunny님의 프로필 이미지
bunny
질문자

감사합니다. 확인하였습니다!

0

큰돌님의 프로필 이미지
큰돌
지식공유자

제 코드에 디버깅 코드를 붙여서 준비해봤는데요. 이런식으로 디버깅해서 해보시겠어요?

#include<bits/stdc++.h>
using namespace std; 
int a[54][54], n, m, t, ret, temp[54][54];
vector<pair<int, int>> v1, v2; 

int dy1[] = {0, -1, 0, 1};
int dx1[] = {1, 0, -1, 0};
int dy2[] = {0, 1, 0, -1};
int dx2[] = {1, 0, -1, 0};  
void mise_go(int dy[], int dx[]){ 
    fill(&temp[0][0], &temp[0][0] + 54 * 54, 0);
    queue<pair<int, int>> q; 
    for(int i = 0; i < n; i++){
        for(int j = 0; j < m; j++){
            if(a[i][j] != -1 && a[i][j]){
                q.push({i, j});
            }
        }
    }
    while(q.size()){ 
    	int y, x;
        tie(y, x) = q.front(); q.pop(); 
        int spread = a[y][x] / 5; 
        for(int i = 0; i < 4; i++){
            int ny = y + dy[i];
            int nx = x + dx[i]; 
            if(ny < 0 || ny >= n || nx < 0 || nx >= m || a[ny][nx] == -1) continue; 
            temp[ny][nx] += spread;
            a[y][x] -= spread;
        }
    }
    for(int i = 0; i < n; i++){
        for(int j = 0; j < m; j++){
            a[i][j] += temp[i][j];
        }
    }
    return;
}  
vector<pair<int, int>> chung(int sy, int sx, int dy[], int dx[]){   
    vector<pair<int, int>> v; 
    int cnt = 0; 
    int y = sy; 
    int x = sx;
    while(true){ 
        int ny = y + dy[cnt];
        int nx = x + dx[cnt];  
        if(ny == sy && nx == sx)break;
        if(ny < 0 || ny >= n || nx < 0 || nx >= m){
            cnt++; 
            ny = y + dy[cnt];
            nx = x + dx[cnt];
        } 
        if(ny == sy && nx == sx)break;
        y = ny; x = nx; 
        v.push_back({ny, nx});
    }
    return v;
} 
void go(vector<pair<int, int>> &v){  
    for(int i = v.size() - 1; i > 0; i--){
        a[v[i].first][v[i].second] = a[v[i - 1].first][v[i - 1].second];
    } 
    a[v[0].first][v[0].second] = 0; 
    return;
}
int main(){
    cin >> n >> m >> t; 
    bool flag = 1; 
    for(int i = 0; i < n; i++){
        for(int j = 0; j < m; j++){
            cin >> a[i][j];
            if(a[i][j] == -1){
                if(flag){
                    v1 = chung(i, j, dy1, dx1);
                    flag = false; 
                }else v2 = chung(i, j, dy2, dx2); 
            }
        }
    }
    while(t--){
        mise_go(dy1, dx1); 
        go(v1); 
        go(v2);   
        for(int i = 0; i < n; i++){
          for(int j = 0; j < m; j++){
            cout << a[i][j] << " ";
          }
          cout << '\n';
        }
        cout << "turn\n";
    } 
    for(int i = 0; i < n; i++){
        for(int j = 0; j < m; j++){
            if(a[i][j] != -1)ret += a[i][j];
        }
    }
    cout << ret << "\n";
} 
bunny님의 프로필 이미지
bunny

작성한 질문수

질문하기