inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

14502 다시금 질문드립니다..!

160

박완섭

작성한 질문수 15

0

http://boj.kr/840f45d321eb47839eab789e324f7551

 

세번째 질문.. 다시 드립니다 ㅠㅠ

 

combi함수에서.. 64~67라인에서 마지막에 pop_back()을 하는 이유도 이해 했습니다. 조합에서 각 재귀가 들어갈 때마다 넣고

재귀함수에서 나오면 빼서 다음 포문에서 골라서 다시 넣어야 하니까요.

 

다만 제가 묻고 싶은 점은.. 

제 문제가 로직상 틀린 점이 없다고 생각했는데 정답 처리가 안나서 어디서 오류가 나는 지를 모르겠습니다 ㅠㅠ

 

 

제가 생각한 사고 방식은 다음과 같습니다.

---

74~79 라인에서 단순히 h벡터에 0인 좌표들을 넣어놓구요..(h는 조합이 될 후보군들의 좌표를 넣어놓은 벡터)

----

combi함수로 들어가.. 

64~68라인에서 h벡터 에서 조합을 해서 s벡터에 좌표들을 넣습니다.(s는 세개를 조합하고 난 선정된 좌표들을 넣어놓은 벡터)

-----

31 라인에서 만약 3개의 좌표가 s벡터에 들어가면

32~36까지 visited 배열을 문제에서 준 초기 배열(== arr배열)로 초기화를 하구요.

38~40은 s벡터에 조합해둔 좌표들에 벽을 세웁니다(1로 바꿔줍니다.)

42~46에서 값이 2인 곳 즉 이미 바이러스가 있는 곳에서 dfs를 합니다.

----

17~27까지 dfs를 하는데.. 이제 해당 좌표로 들어오면 바이러스가 전염된 걸로 보고(2로 바꿔줍니다.)

4방향 중 0인 곳에만 다시 방문을 해서 dfs를 합니다.

----

48~58까지는 단순히 visited 배열 상의 안전지대 즉 값이 0인 곳을 카운팅 해서

기존의 ans와 값을 비교하여 더 큰 값을 측정합니다.

 

 

어느 라인에서 제가 실수를 해서 오답 판정을 받았을까요?

 

 

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

답변 1

0

큰돌

오... ㅎㅎ 이제 모든 코드를 이해하시고 맞왜틀까지 오셨군요. ㅎㅎ

축하드립니다. 완섭님. 

제가 주석을 달아봤습니다. 해당부분 참고해주세요. 감사합니다.  

#define _CRT_SECURE_NO_WARNINGS
#include<bits/stdc++.h>

using namespace std;

int dy[4] = { 1,0,-1,0 };
int dx[4] = { 0,-1,0,1 }; 

int n, m;
int arr[10][10];
int visited[10][10];
vector<pair<int, int>> h;
vector<pair<int, int>> s;
int ans = 0;


void dfs(int y,int x) {
	visited[y][x] = 2;
	for (int i = 0; i < 4; i++) {
		int ny = y + dy[i];
		int nx = x + dx[i];
		if (ny < 0 || ny >= n || nx < 0 || nx >= m) continue;
        // 왜 벽일 때의 로직이 없죠? 벽은 통과 못합니다. 바이러스. 
		if (visited[ny][nx] == 0) { dfs(ny, nx); }
	}
}


void combi(int k) {
	if (s.size() == 3) {
        // visited라는 임시 배열에다가 arr 설정 good 
		for (int i = 0; i < n; i++) {
			for (int j = 0; j < m; j++) {
				visited[i][j] = arr[i][j];
			}
		}
        // 벽 세우기 : good
		for (int i = 0; i < 3; i++) {
			visited[s[i].first][s[i].second] = 1;
		}
        // 바이러스면 퍼진다 : good
		for (int i = 0; i < n; i++) {
			for (int j = 0; j < m; j++) {
				if(visited[i][j] == 2) dfs(i,j);
			}
		}

		int temp = 0;
		for (int i = 0; i < n; i++) {
			for (int j = 0; j < m; j++) {
				if (visited[i][j] == 0) temp++;
			}
		}
		ans = max(temp, ans);
		return;
	}
 
	for (int i = k; i < h.size(); i++) {
		s.push_back(h[i]);
		combi(k + 1);
		s.pop_back();
	}
}

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] == 0) h.push_back({ i,j });
		}
	}

	combi(0);

	cout << ans;


}

1-E질문입니다!

0

533

2

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

0

835

2

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

0

396

1

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

0

471

1

문제 풀 때 방향성에 대해

0

811

1

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

0

530

1

17071번 메모리 초과

0

390

1

1-C질문입니다!

0

428

2

2-B BFS 시간초과질문

0

638

2

1-O 13번 라인

0

447

1

6-J 놀이공원 문제 질문

0

389

1

구현관련 질문

0

492

1

강의 교안

0

322

1

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

0

550

1

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

0

540

1

1-K

0

481

2

3-G번 질문있습니다.

1

481

3

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

0

503

1

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

0

601

2

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

0

441

1

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

0

349

1

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

1

453

2

4-A 출력 질문

0

308

1

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

0

266

1