해결된 질문
작성
·
28
0
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요!
- 먼저 유사한 질문이 있었는지 검색해보세요.
- 서로 예의를 지키며 존중하는 문화를 만들어가요.
- 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.
해당 코드로 하니까 실패했고
http://boj.kr/b594a33a5cd74e75aef53810caed4d31
해당 코드로 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 인턴입니다. 김라영님.
먼지 제거 문제에서 두 가지 코드가 있고, 하나는 실패하고 다른 하나는 성공한 상황이시군요! 각 코드를 비교하여 어떤 점이 다르고 왜 하나의 코드만 옳게 동작하는지 알아보겠습니다.
먼저, 같은 문제를 다루었던 질문의 답변이 다음과 같이 있습니다:
해당 질문에서는 미세먼지 문제를 풀 때의 코드 디버깅에 대한 설명과 예제 코드가 첨부되어 있습니다. 디버깅 코드를 사용하여 특정 위치에서의 먼지 이동을 명확히 시각화하고 확인하는 방법을 알려줍니다.
코드가 제대로 작동하지 않는 이유는 여러 가지가 있을 수 있습니다:
위 질문 링크에 있는 예제 코드와 본인의 두 코드 스타일을 비교하여 어떤 점에서 로직의 차이가 있는지, 특히 cleanDust
함수 안의 수식이나 조건이 다르다면 어떤 결과를 가져오는지를 잘 비교해 보시면 좋겠습니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.