어느 부분에서 안되는 건지 모르겠습니다.(먼지 제거할때)
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요!
- 먼저 유사한 질문이 있었는지 검색해보세요.
- 서로 예의를 지키며 존중하는 문화를 만들어가요.
- 잠깐! 인프런 서비스 운영 관련 문의는 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 함수 안의 수식이나 조건이 다르다면 어떤 결과를 가져오는지를 잘 비교해 보시면 좋겠습니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
교안 158페이지 문의드립니다
0
10
2
코딩살구클럽 관련 건의사항
0
29
1
코살에 19942 다이어트 문제에 N의 범위가 빠져있슴니다
0
13
1
진행 방법 질문드립니다!
0
45
2
2-I) 왜 이 문제가 그래프이론 카테고리에 있는지 잘 모르겠습니다.
0
55
2
2주차 개념#12 트리 순회
0
26
2
백준사이트가 종료된다고 합니다.
0
286
2
백준 서비스 종료
9
890
1
sk 하이닉스 코테 대비
0
368
2
3-G 최댓값 질문
0
50
1
모듈러 연산 값이 10이 아닌 경우도 있지 않나요?
0
83
2
3-I 코드 질문드립니다.
0
62
2
3-N 질문 있습니다.
0
66
2
학습방법
0
102
2
4-H 질문 있습니다 (코드 리뷰)
0
66
2
코딩테스트 어디까지 준비해야 하는지 질문이 있습니다.
0
170
2
2-O 반례가 무엇일지 어떤 부분이 틀렸는지 잘 모르겠습니다.
0
69
2
2주차 개념 #4-2. 인접행렬 질문있습니다.
0
64
2
1-A 문제풀이 후 궁금한 점이 생겨서 질문드립니다.
0
51
2
조합 재귀 풀이 확인 해주시면 감사하겠습니다.
0
68
2
함수별 시간복잡도
0
73
2
3-h 질문입니다.
0
49
1
안녕하세요 선생님. 시간 복잡도 4번 질문있습니다.
0
53
2
1-I 문제 질문 드립니다.
0
76
2





