14502 연구소 질문 다시 드립니다
167
작성한 질문수 15
여전히 문제를 해결하지 못해 재질문 드립니다 ㅠㅠ
===================
오... ㅎㅎ 이제 모든 코드를 이해하시고 맞왜틀까지 오셨군요. ㅎㅎ
축하드립니다. 완섭님.
제가 주석을 달아봤습니다. 해당부분 참고해주세요. 감사합니다.
#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개만 세우는 경우가 생겨버린것이죠 (인덱스 변환 후 디버깅 한번 해보세요. 원래 코드에다가)
감사합니다.
* 또 질문 생기시면 언제든 질문주세요. ㅎ
0
친절한 답변 감사드립니다! 2주동안 헤맸는데 dfs쪽 문제가 아니라 combi문제였네요 ㅠ_ㅠ
좀 더 개념학습을 철저히 해야겠다는 생각이 듭니다. 답변 주셔서 정말 감사드립니다!
1-E질문입니다!
0
513
2
3-L 틀린 부분 피드백 부탁드립니다.
0
815
2
1-A문제 순열재귀함수 질문입니다.
0
380
1
1-A 일곱난쟁이문제입니다
0
454
1
문제 풀 때 방향성에 대해
0
796
1
맥에서 vs code로 실행 관련 질문입니다
0
520
1
17071번 메모리 초과
0
384
1
1-C질문입니다!
0
415
2
2-B BFS 시간초과질문
0
626
2
1-O 13번 라인
0
437
1
6-J 놀이공원 문제 질문
0
379
1
구현관련 질문
0
481
1
강의 교안
0
316
1
실력을 더 올리고나서 강의를 보는 것이 맞을까요?
0
544
1
안녕하세요! 재귀함수에 관해서 질문드립니다
0
534
1
1-K
0
471
2
3-G번 질문있습니다.
1
468
3
3-C 실행 시간 질문드립니다.
0
491
1
4-A 문제 풀이 질문있습니다.
0
589
2
비트마스킹 연산자 "1의 보수" 영문 표기법
0
433
1
격자탐색 문제에서 BFS 시간복잡도 질문드립니다.
0
332
1
3-O go 함수 질문 드립니다.
1
440
2
4-A 출력 질문
0
301
1
1주차 1-O 질문드립니다
0
253
1





