inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

2-Q

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

해결된 질문

308

Hephaestus

작성한 질문수 10

0

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

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

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

C++ 코테 준비 같이 해요!

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

 

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

감사합니다.

강사 큰돌 올림.

0

Hephaestus

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

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

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

1-E질문입니다!

0

518

2

3-L 틀린 부분 피드백 부탁드립니다.

0

821

2

1-A문제 순열재귀함수 질문입니다.

0

385

1

1-A 일곱난쟁이문제입니다

0

456

1

문제 풀 때 방향성에 대해

0

801

1

맥에서 vs code로 실행 관련 질문입니다

0

523

1

17071번 메모리 초과

0

386

1

1-C질문입니다!

0

421

2

2-B BFS 시간초과질문

0

630

2

1-O 13번 라인

0

442

1

6-J 놀이공원 문제 질문

0

381

1

구현관련 질문

0

484

1

강의 교안

0

319

1

실력을 더 올리고나서 강의를 보는 것이 맞을까요?

0

545

1

안녕하세요! 재귀함수에 관해서 질문드립니다

0

536

1

1-K

0

473

2

3-G번 질문있습니다.

1

473

3

3-C 실행 시간 질문드립니다.

0

494

1

4-A 문제 풀이 질문있습니다.

0

590

2

비트마스킹 연산자 "1의 보수" 영문 표기법

0

435

1

격자탐색 문제에서 BFS 시간복잡도 질문드립니다.

0

334

1

3-O go 함수 질문 드립니다.

1

447

2

4-A 출력 질문

0

305

1

1주차 1-O 질문드립니다

0

259

1