4-C 재귀 풀이 질문2
http://boj.kr/367fd4875e384ed7a3c4d8d650155ae6
안녕하세요, 큰돌님.
말씀해주신 대로 벡터에 크기 지정해서 런타임 에러 해결했습니다.
연결성 체크하는 부분은 어떤 방식으로 구현해야 될까요?
DFS로 할 수는 있을 것 같은데, 맞는 방향성이 아닌 것 같다는 생각이 듭니다...
답변 2
0
안녕하세요 ㅎㅎ
연결성 체크하는 부분은 어떤 방식으로 구현해야 될까요?
-> DFS도 되고 BFS도 됩니다.
제가 한번 다듬어봤는데요. (불필요한 변수 제거 등) 참고부탁드립니다.
#include <bits/stdc++.h>
using namespace std;
const int _MAX = 987654321;
int n, k, _k, res = _MAX;
int a[14];
vector<bool> A_t;
vector<vector<int>> v;
bool check(vector<int> group) {
if (group.empty()) return false;
vector<bool> visited(n, false);
queue<int> q;
q.push(group[0]);
visited[group[0]] = true;
int cnt = 1;
while (!q.empty()) {
int cur = q.front(); q.pop();
for (int next : v[cur]) {
next--;
if (!visited[next] && find(group.begin(), group.end(), next) != group.end()) {
visited[next] = true;
q.push(next);
cnt++;
}
}
}
return cnt == group.size();
}
void go(int here) {
if (here == n) {
vector<int> A, B;
for (int i = 0; i < n; i++) {
if (A_t[i]) A.push_back(i);
else B.push_back(i);
}
if (A.empty() || B.empty()) return;
if (!check(A) || !check(B)) return;
int sumA = 0, sumB = 0;
for (int i : A) sumA += a[i];
for (int i : B) sumB += a[i];
res = min(res, abs(sumA - sumB));
return;
}
A_t[here] = true;
go(here + 1);
A_t[here] = false;
go(here + 1);
}
int main() {
cin >> n;
for (int i = 0; i < n; i++) cin >> a[i];
v.resize(n);
for (int i = 0; i < n; i++) {
cin >> k;
for (int j = 0; j < k; j++) {
cin >> _k;
v[i].push_back(_k);
}
}
A_t.resize(n);
go(0);
if (res == _MAX) cout << -1 << '\n';
else cout << res << '\n';
return 0;
}
0
안녕하세요, 인프런 AI 인턴입니다. brigade98님.
말씀해주신 문제를 해결하면서 벡터의 크기를 지정하여 런타임 에러를 해결하신 점, 매우 잘하셨습니다. 연결성을 체크하는 부분에서 DFS(깊이 우선 탐색)를 사용하는 것은 흔한 방법입니다. DFS를 통해 그래프 탐색을 수행하여 서로 연결된 노드들을 효과적으로 검사할 수 있습니다. 연결성 체크를 위한 간단한 방법은 다음과 같습니다:
DFS를 활용한 연결성 체크 방법:
방문 여부 확인 배열 준비: 그래프에 있는 각 노드를 방문했는지 확인할 배열을 준비하세요. 이는 중복 방문을 방지하기 위함입니다.
DFS 탐색 구현:
- 시작 노드에서부터 연결된 모든 인접 노드를 탐색합니다.
- 이미 방문한 노드는 무시하고, 방문하지 않은 노드는 재귀적으로 탐색을 계속합니다.
- 시작 노드에서부터 연결된 모든 인접 노드를 탐색합니다.
그래프 전체 탐색: 모든 노드에 대해 DFS를 시도하여, 연결된 모든 그룹을 확인합니다.
예시 코드 (C++):
#include <vector>
#include <iostream>
std::vector<bool> visited;
std::vector<std::vector<int>> graph;
void dfs(int node) {
visited[node] = true;
for (int neighbor : graph[node]) {
if (!visited[neighbor]) {
dfs(neighbor);
}
}
}
int main() {
int numberOfNodes = ...; // 노드의 수
graph.resize(numberOfNodes);
visited.resize(numberOfNodes, false);
// 그래프 초기화 코드 (간선 추가)
for (int i = 0; i < numberOfNodes; ++i) {
if (!visited[i]) {
dfs(i);
// 연결된 새로운 컴포넌트 발견 시 필요한 작업 수행
}
}
return 0;
}
이 방법을 활용하면 DFS를 통해 연결된 노드들의 그룹을 모두 식별할 수 있습니다. 이 구조를 따라가면서 중복 방문을 피할 수 있고, 각 연결 컴포넌트가 탐색됨을 보장할 수 있습니다.
이전에 유사한 주제로 논의된 게시물을 참조하면 더욱 구체적인 솔루션을 발견할 수 있습니다. 예를 들어, 기존의 유사한 질문 및 답변을 확인하여 DFS를 통한 문제 해결 방법을 참고해 보세요.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
2-I) 왜 이 문제가 그래프이론 카테고리에 있는지 잘 모르겠습니다.
0
18
2
2주차 개념#12 트리 순회
0
20
2
백준사이트가 종료된다고 합니다.
0
235
2
백준 서비스 종료
9
745
1
sk 하이닉스 코테 대비
0
356
2
3-G 최댓값 질문
0
50
1
모듈러 연산 값이 10이 아닌 경우도 있지 않나요?
0
82
2
3-I 코드 질문드립니다.
0
61
2
3-N 질문 있습니다.
0
66
2
학습방법
0
100
2
4-H 질문 있습니다 (코드 리뷰)
0
66
2
코딩테스트 어디까지 준비해야 하는지 질문이 있습니다.
0
165
2
2-O 반례가 무엇일지 어떤 부분이 틀렸는지 잘 모르겠습니다.
0
69
2
2주차 개념 #4-2. 인접행렬 질문있습니다.
0
63
2
1-A 문제풀이 후 궁금한 점이 생겨서 질문드립니다.
0
49
2
조합 재귀 풀이 확인 해주시면 감사하겠습니다.
0
67
2
함수별 시간복잡도
0
72
2
3-h 질문입니다.
0
49
1
안녕하세요 선생님. 시간 복잡도 4번 질문있습니다.
0
52
2
1-I 문제 질문 드립니다.
0
76
2
2-P 질문입니다.
0
56
1
mac에서 시작하기 관련
0
88
2
5-Q 질문
0
63
2
풀이 코드 질문
0
64
2





