inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

4-C와 다양한 타입의 함수

4-C 재귀 풀이 질문2

해결된 질문

81

brigade98

작성한 질문수 7

0

http://boj.kr/367fd4875e384ed7a3c4d8d650155ae6
안녕하세요, 큰돌님.

말씀해주신 대로 벡터에 크기 지정해서 런타임 에러 해결했습니다.

연결성 체크하는 부분은 어떤 방식으로 구현해야 될까요?
DFS로 할 수는 있을 것 같은데, 맞는 방향성이 아닌 것 같다는 생각이 듭니다...

c++ 코딩-테스트

답변 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 인턴

안녕하세요, 인프런 AI 인턴입니다. brigade98님.

말씀해주신 문제를 해결하면서 벡터의 크기를 지정하여 런타임 에러를 해결하신 점, 매우 잘하셨습니다. 연결성을 체크하는 부분에서 DFS(깊이 우선 탐색)를 사용하는 것은 흔한 방법입니다. DFS를 통해 그래프 탐색을 수행하여 서로 연결된 노드들을 효과적으로 검사할 수 있습니다. 연결성 체크를 위한 간단한 방법은 다음과 같습니다:

DFS를 활용한 연결성 체크 방법:

  1. 방문 여부 확인 배열 준비: 그래프에 있는 각 노드를 방문했는지 확인할 배열을 준비하세요. 이는 중복 방문을 방지하기 위함입니다.

  2. DFS 탐색 구현:

    • 시작 노드에서부터 연결된 모든 인접 노드를 탐색합니다.
    • 이미 방문한 노드는 무시하고, 방문하지 않은 노드는 재귀적으로 탐색을 계속합니다.
  3. 그래프 전체 탐색: 모든 노드에 대해 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를 통한 문제 해결 방법을 참고해 보세요.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

코딩살구클럽

0

10

1

코딩살구클럽 문의

0

25

2

코딩살구클럽 승인

0

28

2

DP 경우의 수 설명이 이해가 되지 않습니다.

0

32

2

3-F 채점 관련 질문

0

29

1

BFS, DFS 활용이 되는 상황에서의 방향성

0

32

2

코딩살구클럽 승인

0

41

2

코딩살구클럽승인

0

36

3

코딩살구클럽 승인

0

50

2

3-D 관련 질문

0

35

2

코살구 회원가입 문의

0

45

2

코살구 로그인 문제

0

65

2

3-A 문제 풀이 관련 질문

0

56

3

2-O 질문 있습니다

0

38

2

2-T 문제에 관한 질문

0

40

2

코딩 살구 클럽 접속 및 사용방법 문의

0

62

2

안녕하세요~. 현재 코살코딩클럽 사이트가 접속이 안됩니다~

0

64

2

코딩살구클럽 로그인문제

0

78

3

코딩 살구 클럽 로그인 문제

0

84

2

2-J 채점관련 질문

0

65

3

코딩 살구 클럽 Python 지원 가능 여부

0

77

1

살구클럽 아이디 없음 문제

0

76

1

1-O 코딩살구클럽 채점관련 질문

0

60

2

히든 테스트 케이스가 사라졌습니다

0

57

1