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

김라영님의 프로필 이미지
김라영

작성한 질문수

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

5-K

어느 부분에서 안되는 건지 모르겠습니다.(먼지 제거할때)

해결된 질문

작성

·

28

0

- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요!
- 먼저 유사한 질문이 있었는지 검색해보세요.
- 서로 예의를 지키며 존중하는 문화를 만들어가요.
- 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.

  1. 해당 코드로 하니까 실패했고
    http://boj.kr/b594a33a5cd74e75aef53810caed4d31

  2. 해당 코드로 cleanDust부분을 변경하니까 맞았습니다. 왜 1번 처럼 cleanDust를 해주는 거는 틀린 걸까요?
    http://boj.kr/da76558b5fd7483caa9fe86f42569358

답변 2

0

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

안녕하세요 라영님 ㅎㅎ

1번의 경우 다음과 같이 -1 조차도 옮겨버리는 문제점이 있습니다. 이부분때문에 틀린 것 같습니다.

clean
0 0 0 0 0 1 8 6 
0 0 1 0 3 0 5 5 
-1 2 2 1 1 0 4 6 
-1 -1 5 2 0 0 2 12 
0 1 1 0 5 10 13 0 
0 1 9 4 3 5 12 8 
0 17 8 3 4 8 4 0 

 

 

디버깅 코드:

#include <bits/stdc++.h> 
using namespace std; 
int r, t, c, ret;
int a[54][54], dustA[54][54];
vector<pair<int, int>> cleanDir;
int dy[] = {-1, 0, 1, 0};
int dx[] = {0, 1, 0, -1};

void printDust() {
    cout << "--------------------dustMap-----------\n";
    for(int i = 0; i < r; i++) {
        for(int j = 0; j < c; j++) {
            cout << dustA[i][j] << " ";
        }
        cout << "\n";
    }
}

void makeDust(int y, int x) {
    int dir = 0;
    for(int i = 0; i < 4; i++) {
        int ny = y + dy[i];
        int nx = x + dx[i];
        if(ny < 0 || nx < 0 || ny >= r || nx >= c) continue;
        if(a[ny][nx] == -1) continue;
        dustA[ny][nx] += a[y][x] / 5;
        dir++;
    }
    dustA[y][x] += a[y][x] - (a[y][x] / 5) * dir;
    return;
}
 

void cleanDust(int y, int x, int dir) {
    if(dir == 0) {
        // x: 1 ~ c(->)
        int temp = a[y][c - 1];
        for(int i = c - 1; i > 1; i--) {
            a[y][i] = a[y][i - 1];
        }
        // 위쪽
        int temp2 = a[0][c - 1];
        for(int i = 0; i < y; i++) {
            if(i == y - 1) a[i][c - 1] = temp;
            else a[i][c - 1] = a[i + 1][c - 1]; 
        }
        // 왼쪽
        temp = a[0][0];
        for(int i = 0; i < c - 1; i++) {
            if(i == c - 2) a[0][i] = temp2;
            else a[0][i] = a[0][i + 1];
        }
        for(int i = y - 1; i > 0; i--) {
            if(i == 1) a[i][0] = temp;
            else a[i][0] = a[i - 1][0];
        }
    } else {
        int temp = a[y][c - 1];
        for(int i = c - 1; i > x; i--) {
            a[y][i] = a[y][i - 1];
        }
        //down
        int temp2 = a[r - 1][c - 1];
        for(int i = r - 1; i > y; i--) {
            if(i == y + 1) a[i][c - 1] = temp;
            else a[i][c - 1] = a[i - 1][c - 1];
        }
        temp = a[r - 1][0];
        for(int i = 0; i < c - 1; i++) {
            if(i == c - 2) a[r - 1][i] = temp2;
            else a[r - 1][i] = a[r - 1][i + 1];
        }
        for(int i = r - 1; i > y; i--) {
            if(i == y + 1) a[i][0] = temp;
            else a[i][0] = a[i - 1][0]; 
        }
    }
}

int main() {
	cin >> r >> c >> t;
    for(int i = 0; i < r; i++) {
        for(int j = 0; j < c; j++) {
            cin >> a[i][j];
            if(a[i][j] == -1) cleanDir.push_back({i, j});
        }
    }

    for(int k = 0; k < t; k++) {
        memset(dustA, 0, sizeof(dustA)); // 먼지 확산 맵 다시 초기화
        for(int i = 0; i < r; i++) {
            for(int j = 0; j < c; j++) {
                // if(a[i][j] > 0) makeDust(i, j);
                if(a[i][j] == 0 || a[i][j] == -1) continue;
                if(a[i][j] < 5) dustA[i][j] += a[i][j];
                else makeDust(i, j);
            }
        }

        // 기존의 맵을 확산된 맵으로 치환해주기
        for(int i = 0; i < r; i++) {
            for(int j = 0; j < c; j++) {
                if(a[i][j] != -1) {
                    a[i][j] = dustA[i][j];
                }
            }
        }

        // 공기청정기 가동
        cleanDust(cleanDir[0].first, cleanDir[0].second, 0);
        cleanDust(cleanDir[1].first, cleanDir[1].second, 1);
        cout << "clean\n";
        for(int i = 0; i < r; i++) {
            for(int j = 0; j < c; j++) {
                cout << a[i][j] << " "; 
            }
            cout << '\n';
        }
        
    }
    
    for(int i = 0; i < r; i++) {
        for(int j = 0; j < c; j++) {
            if(a[i][j] != 0) ret += a[i][j];
        }
    }

    cout << ret + 2 << "\n";
	return 0;
} 

또 질문 있으시면 언제든지 질문 부탁드립니다.

좋은 수강평과 별점 5점은 제게 큰 힘이 됩니다. :)

감사합니다.

강사 큰돌 올림.


0

안녕하세요, 인프런 AI 인턴입니다. 김라영님.

먼지 제거 문제에서 두 가지 코드가 있고, 하나는 실패하고 다른 하나는 성공한 상황이시군요! 각 코드를 비교하여 어떤 점이 다르고 왜 하나의 코드만 옳게 동작하는지 알아보겠습니다.

먼저, 같은 문제를 다루었던 질문의 답변이 다음과 같이 있습니다:

  1. 10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트: 김라영님의 사례 분석

해당 질문에서는 미세먼지 문제를 풀 때의 코드 디버깅에 대한 설명과 예제 코드가 첨부되어 있습니다. 디버깅 코드를 사용하여 특정 위치에서의 먼지 이동을 명확히 시각화하고 확인하는 방법을 알려줍니다.

코드가 제대로 작동하지 않는 이유는 여러 가지가 있을 수 있습니다:

  • 경계 조건: 먼지가 방의 끝에 있을 때 잘못 처리되었을 수 있습니다.
  • 순서 문제: 먼지를 확산시키고 청소하는 순서가 잘못 설정되어 있을 수 있습니다.
  • 변수 초기화: 사용하는 배열이나 변수들이 정리되지 않고 사용되는 경우가 발생할 수 있습니다.

위 질문 링크에 있는 예제 코드와 본인의 두 코드 스타일을 비교하여 어떤 점에서 로직의 차이가 있는지, 특히 cleanDust 함수 안의 수식이나 조건이 다르다면 어떤 결과를 가져오는지를 잘 비교해 보시면 좋겠습니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

김라영님의 프로필 이미지
김라영

작성한 질문수

질문하기