CS/λ°±μ€€

[ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€/C++] λ„€νŠΈμ›Œν¬ (DFS,BFS - L3)

κ°•μ˜μ„œ 2023. 11. 17. 18:07

https://school.programmers.co.kr/learn/courses/30/lessons/43162

 

ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€

μ½”λ“œ μ€‘μ‹¬μ˜ 개발자 μ±„μš©. μŠ€νƒ 기반의 ν¬μ§€μ…˜ λ§€μΉ­. ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€μ˜ 개발자 λ§žμΆ€ν˜• ν”„λ‘œν•„μ„ λ“±λ‘ν•˜κ³ , λ‚˜μ™€ 기술 ꢁ합이 잘 λ§žλŠ” 기업듀을 λ§€μΉ­ λ°›μœΌμ„Έμš”.

programmers.co.kr

 

각 λ…Έλ“œλ“€μ΄ μ—°κ²°λ˜μ–΄μžˆλŠ”μ§€λ₯Ό νŒŒμ•…ν•˜κ³  ν•œ λ¬ΆμŒμ„ λ„€νŠΈμ›Œν¬λΌ μΉ­ν•œλ‹€.

μ—¬κΈ°μ„œ λ„€νŠΈμ›Œν¬κ°€ 총 λͺ‡κ°œμΈμ§€? 좜λ ₯ν•˜λŠ” 문제.

 

BFSλ‘œλ„ κ°€λŠ₯ν•˜λ‹€. ν•„μžλŠ” DFS둜 ν’€μ—ˆκ³ , 

각 λ…Έλ“œ λ³„λ‘œ 탐색을 ν•˜λ˜, ν•œλ²ˆ 탐색을 ν–ˆλ˜ 기둝을 visited에 μ €μž₯ν•΄μ„œ 더 이상 νƒμƒ‰ν•˜μ§€ μ•Šλ„λ‘ ν–ˆλ‹€.

μ™œλƒλ©΄ 단 ν•˜λ‚˜λΌλ„ 연결이 되면 κ·Έ λ…Έλ“œλŠ” λ„€νŠΈμ›Œν¬μ— μ†ν•˜κΈ° λ•Œλ¬Έμ΄λ‹€.

 

λͺ¨λ“  λ…Έλ“œμ™€λ„ μ—°κ²°λ˜μ§€ μ•Šμ€ λ…Έλ“œμ˜ κ²½μš°λŠ” λ…Έλ“œ ν•˜λ‚˜λ§Œ μžˆλŠ” 단일 λ„€νŠΈμ›Œν¬μ΄λ―€λ‘œ κ·Έ 뢀뢄을 μ„ΈλŠ” 처리λ₯Ό μ§„ν–‰ν—Έλ‹€.

 

#include <string>
#include <vector>
#include <iostream>

using namespace std;

bool visited[201];
vector<int> connected[201];
int n;


void DFS(int idx){
    
    //λ°©λ¬Έ 처리 μ§„ν–‰
    if(visited[idx] == false) visited[idx] = true;
    else return;
    
    
    //μ—°κ²°λœ λ…Έλ“œλ“€μ„ 확인
    for(int i = 0; i < connected[idx].size(); i++){
        
        //μ—°κ²°λ˜μ–΄ μžˆμ„ 경우, 탐색
        DFS(connected[idx][i]);
    }

}

int solution(int _n, vector<vector<int>> computers) {
    
    // 1 <= n <= 200 μžμ—°μˆ˜
    n = _n;
    int answer = 0;
    
    for(int i = 0; i < n; i++){
        for(int j = 0; j < n; j++){
            
            if(i == j) continue;
            
            if(computers[i][j] == 1) connected[i].push_back(j);
        }
    }
    
    //각 λ…Έλ“œλ³„ 탐색을 μ§„ν–‰ν•œλ‹€
    for(int i = 0; i < n ; i++){
        
        
        //ν•˜λ‚˜λ„ μ—°κ²°λ˜μ–΄μžˆμ§€ μ•Šμ„ 경우, λ„€νŠΈμ›Œν¬ ν•˜λ‚˜λ‘œ μ·¨κΈ‰
        if(connected[i].size() == 0){
            
            cout << "alone" << endl;
            answer++;
            continue;
        }
        
        
        //μ—°κ²°λ˜μ–΄ μžˆμ§€λ§Œ, 
        if(visited[i] == false) {
            
            cout << "탐색" << endl;
            
            DFS(i);
            answer++;
        }
    }
    
    return answer;
}

 

κ²°κ³Ό