문제풀이(Problem Solving)

백준, BOJ, 11724번 C++ [CPP]

게임이 더 좋아 2021. 6. 14. 22:48
반응형
728x170

처음은 헤맸던 문제다.

BFS를 너무 많이써서 이번엔 DFS로 해결하였다.

 

시간도 메모리도 충분하다

음,,3초면 연산이 15번정도면 되려나...?

O(N^2)도 통과될 느낌이다.

 

https://www.acmicpc.net/problem/11724

 


 

 

#틀린 풀이와 맞은 풀이를 같이 두었다.

#include<iostream>
#include<vector>
#include<stack>


using namespace std;

int N, M ; // 노드, 간선
vector<int> node[1001]; // 노드에 연결된 노드의 정보를 담는 배열 ex) 1번 노드에 연결된 정보를 가리키는 벡터가 있음
int visited[1001];
int cnt = 0;

stack<int> stk; //DFS를 위함

int main(){
    ios::sync_with_stdio(0);
    cin.tie(0);
    
    cin >> N >> M;
    
    /*
    //이렇게 하려면... 사전순으로 정리해야함 -> 입력을 사전순으로 받아야함.
    for(int i = 0; i<M; i++){
        int a,b;
        cin >> a >> b;
        //어느 한 노드라도 이미 방문되었다면 -> 그것은 연결되어있는 요소
        if(visit[a] != 0 || visit[b] != 0){
            visit[a] = 1;
            visit[b] = 1;
        }else{ // 둘다 방문하지 않았으면 새로운 연결요소
            visit[a] = 1;
            visit[b] = 1;
            cnt++;
        }
    }
    */
    
    //노드에 연결상태를 담고싶음
    for(int i = 1; i<= M; i++){
        int n1, n2;
        cin >> n1 >> n2;
        //n1노드에 연결된 n2 상태추가 , 쌍방향이므로 n2에 n1정보 추가
        node[n1].push_back(n2);
        node[n2].push_back(n1);
        
    }
    
    //DFS나 BFS 조사
    //전 노드에 대해서
    for(int i = 1; i<=N; i++){
        
        //방문했으면 다음 거
        if(visited[i] == 1) continue;
        
        //방문안했으면 
        stk.push(i);
        cnt++;
        visited[i] = 1;
        
        // DFS 실행
        while(!stk.empty()){
            int cur = stk.top();
            visited[cur] = 1;
            stk.pop();
            
            //node[i]에 연결되어있는 노드 다 집어넣음
            if(!node[cur].empty()){
                for(int a : node[cur]){
                    if(visited[a] == 1)continue; // 이미 방문한노드는 집어넣지 않음.
                    stk.push(a);
                }
            }else{ // 아무것도 연결되어있지 않다면 pass
                continue;
            }
        }    
    }

    cout << cnt;
}

 

 

음.. DFS의 의미대로

모든 노드를 조사하되

visited된 노드는 조사하지 않고

처음 노드를 stack에 넣고

뺀 다음 그 노드에 저장된 다른 노드의 정보를 다 넣고

그 노드에 맨 위를 꺼내서..

..반복

 

전 노드를 반복하기 때문에 

노드 연결정보를 가지고 있지 않은 노드도 있을텐데 그때는 어차피.. 바로 종료되어서 상관없겠지만..

else로 예외처리해줬다.

 

연결상태란

그냥 그 그림 문제랑 같다.

모여있는 조각들이 몇개냐 그거다.

 


 

내가 틀린 풀이라고 적어놨지만

뭐 정렬을 어떻게 하느냐에따라 저게 정답이 될 수 있다

 

다만 정렬을 어떻게 해야하냐면..

1,2가 처음 노드라면

그 뒤에는 2로 시작하는 모든것이 와야하고..

(2,7)이 마지막이라면

7로시작하는 모든것이 와야한다..

즉, BFS랑 다를 바가 없다

N(N-1)/2번 정렬을 해야할 것같으므로.. 패스

 

 

728x90
반응형
그리드형

'문제풀이(Problem Solving)' 카테고리의 다른 글

백준, BOJ, 1259번 C++ [CPP]  (0) 2021.06.18
백준, BOJ, 16236번 C++ [CPP]  (0) 2021.06.15
백준, BOJ, 1764번 C++ [CPP]  (0) 2021.06.14
백준, BOJ, 1620번 C++ [CPP]  (0) 2021.06.14
백준, BOJ, 1074번 C++ [CPP]  (0) 2021.06.14