강의

멘토링

커뮤니티

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

Hephaestus님의 프로필 이미지
Hephaestus

작성한 질문수

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

2-Q

2 - Q 시간 카운팅에 대해서 질문드립니다!

해결된 질문

작성

·

304

·

수정됨

0

안녕하세요 큰돌님 항상 좋은 강의 감사드립니다!

다름이 아니라 제 풀이에서 while문을 통해 치즈가 녹아 없어지는 시간(t)을 카운팅 하려는데 계속 t가 하나 더 카운팅 되더라고요.. 잘못된 부분을 찾아보고자 검토를 해봤지만 제가 검토한 바로는 정상적으로 while문 안에서만 t가 정상적으로 카운팅 되더라고요.. 그래서 창피하지만 while문이 끝나고 t--를 해줬는데 도대체 어디서 t가 한 번 더 카운팅 되었던 것일까요? (일단 채점은 정답으로 뜹니다..) 분명히 기본적인 것에서 잘못된 것 같은데 계속 이것만 보고 있으니 점점 더 미궁으로 빠지는 기분입니다..ㅠㅠ

http://boj.kr/748319d1f9e2406c9819a30c57609f05 제 풀이 입니다!

답변 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;
} 

 

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

감사합니다.

강사 큰돌 올림.

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

앗.. 사라지고 한 번 더 카운팅 됐던 거군요!

if (cnt) {
    temp = cnt;
}
else break;
		
t++;

카운팅 전에 break를 걸어주니 정상작동하네요😅 답변 감사드립니다!

Hephaestus님의 프로필 이미지
Hephaestus

작성한 질문수

질문하기