14502 다시금 질문드립니다..!
160
작성한 질문수 15
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와 값을 비교하여 더 큰 값을 측정합니다.
어느 라인에서 제가 실수를 해서 오답 판정을 받았을까요?
답변 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





