๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Algorithm ๐Ÿง‘๐Ÿป‍๐Ÿ’ป/ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค(Programmers)

[c++] ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค - ๊ฐ€์žฅ ๋จผ ๋…ธ๋“œ(Level 3)

by ์•ˆ์ฃผํ˜• 2022. 5. 5.

๋ฌธ์ œ

 

์ฝ”๋”ฉํ…Œ์ŠคํŠธ ์—ฐ์Šต - ๊ฐ€์žฅ ๋จผ ๋…ธ๋“œ

6 [[3, 6], [4, 3], [3, 2], [1, 3], [1, 2], [2, 4], [5, 2]] 3

programmers.co.kr

 

์ฝ”๋“œ

#include <string>
#include <vector>
#include <memory.h>
#include <queue>
#include <algorithm>
#include <iostream>

using namespace std;

vector<int>graph[20001], dists;
bool visited[20001];
int dist[20001];
int max_dist = -1;

void bfs(int start){
    queue<int>q;
    q.push(start);
    visited[start] = 1;
    
    while(!q.empty()){
        int x = q.front();
        q.pop();
        for(int next: graph[x]){
            if(!visited[next]){
                dist[next] = dist[x] + 1;
                max_dist = max(dist[next] ,max_dist);
                visited[next] = 1;
                q.push(next);
            }
        }
    }
}

int solution(int n, vector<vector<int>> edge) {
    int answer = 0;
    
    for(int i=0; i<edge.size(); i++){
        int a = edge[i][0];
        int b = edge[i][1];
        graph[a].push_back(b);
        graph[b].push_back(a);
    }
    
    bfs(1);
    for(int i:dist){
        if(i==max_dist) answer++;
    }
    
    return answer;
}

int main(){
    cout<<solution(6, {{3, 6}, {4, 3}, {3, 2}, {1, 3}, {1, 2}, {2, 4}, {5, 2}});
}

 

ํ’€์ด

์ œ์ผ ์ฒ˜์Œ์— ํ”Œ๋กœ์ด๋“œ-์™€์ƒฌ๋กœ ํ•ด๊ฒฐ์„ ํ•˜๋ ค๊ณ  ํ–ˆ์œผ๋‚˜, ๋…ธ๋“œ์˜ ๊ฐœ์ˆ˜๊ฐ€ 20,000๊นŒ์ง€ ๋“ค์–ด์˜ค๊ธฐ์— O(N^3)์ธ ํ”Œ๋กœ์ด๋“œ๋กœ๋Š” ํ•ด๊ฒฐํ•  ์ˆ˜๊ฐ€ ์—†์–ด dfs๋กœ ํ•ด๊ฒฐ์„ ํ•˜๋ ค๊ณ  ํ–ˆ์Šต๋‹ˆ๋‹ค. 1๋ฒˆ์„ ์ œ์™ธํ•œ ๋ชจ๋“  ๊ฐ ๋…ธ๋“œ์—์„œ ์ถœ๋ฐœํ•˜์—ฌ 1๋ฒˆ ์ด ๋  ๋•Œ๊นŒ์ง€ ํƒ์ƒ‰ํ•˜์—ฌ ์•„๋ž˜์™€ ๊ฐ™์ด ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค.

#include <string>
#include <vector>
#include <memory.h>
#include <algorithm>

using namespace std;

vector<int>graph[20001];
bool visited[20001];
vector<int>dists;
int temp_dist = 1e9, min_dist=1e9;
void dfs(int x, int depth){
    visited[x] = 1;
    if(x == 1){
        temp_dist = min(temp_dist,depth);
        return;
    }
    
    for(int i:graph[x]){
        if(visited[i]) continue;
        visited[i] = 1;
        dfs(i,depth+1);
        visited[i] = 0;
    }
}

int solution(int n, vector<vector<int>> edge) {
    int answer = 0;
    
    for(int i=0; i<edge.size(); i++){
        int a = edge[i][0];
        int b = edge[i][1];
        graph[a].push_back(b);
        graph[b].push_back(a);
        
    }
    
    for(int i=2; i<=n; i++){
        dfs(i,1);
        min_dist = min(min_dist, temp_dist);
        dists.push_back(temp_dist);
        temp_dist = 1e9;
        memset(visited,0,sizeof(visited));
    }
    
    sort(dists.begin(),dists.end(),greater<>());
    
    int max_dist = dists.front();
    
    for(int i:dists){
        if(i==max_dist) answer++;
    }
    
    return answer;
}

ํ•˜์ง€๋งŒ 1, 2, 3๋ฒˆ์˜ ํ…Œ์ŠคํŠธ์ผ€์ด์Šค ๋นผ๊ณ ๋Š” ์ „๋ถ€ ์‹œ๊ฐ„ ์ดˆ๊ณผ๊ฐ€ ๋–ด๋Š”๋ฐ, ์ตœ๋‹จ๊ฑฐ๋ฆฌ๋ฅผ ์ฐพ๋Š” ๊ฒฝ์šฐ ๊ฐ€์ค‘์น˜๊ฐ€ 0๊ณผ 1๋ฐ–์— ์—†๊ธฐ์— BFS๋กœ ํ‘ธ๋Š” ๊ฒŒ ํšจ์œจ์ ์ด๋ผ๋Š” ๊ฒƒ์„ ์˜ˆ์ „์— ๋ฐฐ์›Œ์„œ ์ธ์ง€ํ•˜๊ณ  ์žˆ์—ˆ์ง€๋งŒ dfs์— ์ต์ˆ™ํ•ด์ ธ์„œ ํ’€์—ˆ๋”๋‹ˆ ๋‚ญํŒจ๋ฅผ ๋ดค์Šต๋‹ˆ๋‹ค. 

๊ทธ๋ž˜ํ”„ ์ด๋ก  ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ข€ ๋” ๋งŽ์ด ํ’€์–ด๋ด์•ผ ํ•  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋Œ“๊ธ€