[구름톤 챌린지] 연합

ppparkta·2023년 9월 10일
1

Problem solving

목록 보기
65/65
post-thumbnail

연합

문제

풀이

그래프 문제였다. 그래프 내에서 연결된 집합이 몇개인지 찾으면 됐다. visit배열을 이용해서 방문한 배열을 체크할 수 있었다.

dfs보다는 bfs가 조금 더 눈에 보이는 느낌이라서 코드를 보고도 금방 이해할 수 있었다. 그냥 visit배열에 걸리지 않고 bfs 함수로 들어간 횟수를 체크해주면 돼서 식은 간단했다.

이 문제를 끝으로 구름톤 챌린지가 끝났다. 시간이 없어서, 까먹어서 등등...의 이유로 제대로 풀어보지 않고 넘어갔던 문제를 다시 풀어보니까 기분이 좋다. 물론 내 힘으로 해결하지 못한 문제들도 있었다. 그런 문제들을 마주칠때면 가슴이 답답하고 이런것도 못 푸는 내 실력이 미워졌지만 앞으로 공부하다보면 스스로 해결할 수 있지 않을까 싶다.

지금 풀고있는 문제들도 처음에는 못 풀었던 문제들이니까!

이번 챌린지 계기로 코테연습도 열심히 하고 기본적인 cs들도 놓치지 않고 공부했으면 좋겠다. 42과제 하다보니 이전에 부족했었던 구현력이 조금 올라가서 기분 좋은데, 꾸준히 내가 쥐고있는 것들 열심히 해보자. 파이팅!


#include <iostream>
#include <vector>
#include <queue>
using namespace std;

const int MAX = 2001;
vector<int> v[MAX];
int temp[MAX][MAX], visited[MAX];

void BFS(int S) {
    queue<int> Q;
    Q.push(S);
    visited[S] = 1;
    while (!Q.empty()) {
        int cur = Q.front(); 
        Q.pop();
        for (int i; i<v[cur].size();i++) {
            if (visited[i]) continue;
            visited[i] = 1;
            Q.push(i);
        }
    }
}

int main() {
    int N, M;
    cin >> N >> M;
    for (int i = 0; i < M; ++i) {
        int a, b;
        cin >> a >> b;
        temp[a][b] = 1;
    }

    for (int i = 1; i <= N; ++i) {
        for (int j = i + 1; j <= N; ++j) {
            if (temp[i][j] && temp[j][i]) {
                v[i].push_back(j);
                v[j].push_back(i);
            }
        }
    }

    int ans = 0;
    for (int i = 1; i <= N; ++i) {
        if (visited[i]) continue;
        ans++;
        BFS(i);
    }

    cout << ans << '\n';
    return 0;
}
profile
겉촉속촉

0개의 댓글