인프런 커뮤니티 질문&답변
2 - Q 시간 카운팅에 대해서 질문드립니다!
해결된 질문
작성
·
304
·
수정됨
0
안녕하세요 큰돌님 항상 좋은 강의 감사드립니다!
다름이 아니라 제 풀이에서 while문을 통해 치즈가 녹아 없어지는 시간(t)을 카운팅 하려는데 계속 t가 하나 더 카운팅 되더라고요.. 잘못된 부분을 찾아보고자 검토를 해봤지만 제가 검토한 바로는 정상적으로 while문 안에서만 t가 정상적으로 카운팅 되더라고요.. 그래서 창피하지만 while문이 끝나고 t--를 해줬는데 도대체 어디서 t가 한 번 더 카운팅 되었던 것일까요? (일단 채점은 정답으로 뜹니다..) 분명히 기본적인 것에서 잘못된 것 같은데 계속 이것만 보고 있으니 점점 더 미궁으로 빠지는 기분입니다..ㅠㅠ
답변 1
1
큰돌
지식공유자
안녕하세요 종인님 ㅎㅎ
정말 잘짜셧는데요. 종인님 코드가 do while로 되어있기 때문입니다.
제가 디버깅 코드를 좀 추가해봤는데요.
한번 돌려보시면 감이 오실 겁니다.
설명을 드리면 치즈녹음 >> 3이 되는 순간!!! 종료가 되어야 하는데 종인님 코드는 한번 더~ 해서 +1 이 되는 것이죠.
#include <bits/stdc++.h>
using namespace std;
int n, m, t, cnt, temp, air;
int arr[104][104];
int visited[104][104];
int dy[4] = { -1, 0 ,1, 0 };
int dx[4] = { 0, 1, 0 , -1 };
void dfs(int y, int x) {
visited[y][x] = 1;
for (int i = 0; i < 4; i++) {
int ny = y + dy[i];
int nx = x + dx[i];
if (ny < 0 || nx < 0 || ny >= n || nx >= m || visited[ny][nx] || arr[ny][nx]) continue;
dfs(ny, nx);
}
return;
}
void check(int y, int x) {
// 공기 중에 노출되어 있는 치즈 검출
if (visited[y][x] == 0 && arr[y][x] == 1) {
// 좌표점 기준으로 4방향을 검사
for (int i = 0; i < 4; i++) {
int ny = y + dy[i];
int nx = x + dx[i];
// 공기가 있으면 카운팅
if (visited[ny][nx] == 1) air++;
}
// 카운팅 된 공기가 하나라도 있으면 노출된 치즈
if (air) {
cnt++;
arr[y][x] = 0;
}
air = 0;
}
return;
}
int main() {
cin >> n >> m;
// 입력
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
cin >> arr[i][j];
if (arr[i][j] == 1) cnt++;
}
}
// 전역변수 cnt 초기값이 0 이라 do ~ while
do
{
// 초기화
cnt = 0;
fill(&visited[0][0], &visited[0][0] + 104 * 104, 0);
dfs(0, 0);
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
check(i, j);
}
}
// 전부 없어지기 한 시간 전 치즈 개수 저장
if (cnt) {
temp = cnt;
}
t++;
cout << "지금 이순간~~ : "<< t << "\n";
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
cout << arr[i][j] << " ";
}
cout << "\n";
}
// 시간 카운팅
} while (cnt);
t--;
cout << t << "\n" << temp << "\n";
return 0;
}
또 질문 있으시면 언제든지 질문 부탁드립니다.
감사합니다.
강사 큰돌 올림.






앗.. 사라지고 한 번 더 카운팅 됐던 거군요!
카운팅 전에 break를 걸어주니 정상작동하네요😅 답변 감사드립니다!