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

박완섭님의 프로필 이미지
박완섭

작성한 질문수

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

14502 연구소 질문 다시 드립니다

작성

·

128

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;


}

 

 

====

 

이렇게 답변을 주셨었는데 

http://boj.kr/c4cc788e26cf4f6f9970c6afcd0ac121

위와 같이 25번째 라인을 수정하라는 뜻으로 이해하였습니다.

하지만

1) 24번째 라인은 단순히 arr[-1][0]과 같은 곳을 참조하지 않도록 가드를 둔것이고

2) 26번째 라인에서 if문을 통해 오직 0일 때만 즉,  이미 2인 곳에 상하좌우 인접한 네칸 중 0인 곳에 한해서만 dfs를 다시 재수행 하기 때문에

 

25번째 라인이 사실상 무의미 하다는 생각이 들었습니다.

물론 다시 제출했지만 여전히 오답 판정을 받았습니다.

 

제가 저 위에 큰돌님께서 주신 답변을 제대로 이해하지 못한 것 같은데 조금만 더 구체적으로 답변 주실 수 있으실까요?

 

반복되는 질문에 꾸준히 답변 주셔서 진심으로 감사드립니다. (__)

(이와 비슷한 문제가 코테에 나왔을 때 제가 짠 코드대로만 제 사고방식이 흐를 것 같아 집요하게 문제점을 파악중입니다..ㅠㅠ)

답변 1

1

큰돌님의 프로필 이미지
큰돌
지식공유자

http://boj.kr/a8f0c40616ca4a35bf805bc6c0e81938

완섭님 코드 베이스로 수정 > 제출 > 맞았습니다. 해당 코드 보시고 공부해주세요. 

완섭님코드에서 잘못된 점은 combi 함수입니다.

1. 일단 combi함수에는 index가 들어가야 합니다. 그래야 디버깅을 할 수 있어요. 완섭님의 원본 코드는 좌표인 값이 들어가죠? + combi 함수자체가 올바르지 않았어요. 

 - 인덱스로 변환이후 찍어보니 똑같은 인덱스가 3번 나오더군요. 34 34 34 로요. 즉, 벽을 3개를 세워야하는데 1개만 세우는 경우가 생겨버린것이죠 (인덱스 변환 후 디버깅 한번 해보세요. 원래 코드에다가) 

 

감사합니다.

 * 또 질문 생기시면 언제든 질문주세요. ㅎ

박완섭님의 프로필 이미지
박완섭
질문자

친절한 답변 감사드립니다! 2주동안 헤맸는데 dfs쪽 문제가 아니라 combi문제였네요 ㅠ_ㅠ

좀 더 개념학습을 철저히 해야겠다는 생각이 듭니다. 답변 주셔서 정말 감사드립니다!

박완섭님의 프로필 이미지
박완섭

작성한 질문수

질문하기