๐Ÿ“ฆ Chango/๐Ÿฃ EDOC

[BOJ][C++] ๋ฐฑ์ค€ 1058๋ฒˆ : ์นœ๊ตฌ

์„ ๋‹ฌ 2021. 11. 10. 17:55
๋ฐ˜์‘ํ˜•

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

 

1058๋ฒˆ: ์นœ๊ตฌ

์ง€๋ฏผ์ด๋Š” ์„ธ๊ณ„์—์„œ ๊ฐ€์žฅ ์œ ๋ช…ํ•œ ์‚ฌ๋žŒ์ด ๋ˆ„๊ตฌ์ธ์ง€ ๊ถ๊ธˆํ•ด์กŒ๋‹ค. ๊ฐ€์žฅ ์œ ๋ช…ํ•œ ์‚ฌ๋žŒ์„ ๊ตฌํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๊ฐ ์‚ฌ๋žŒ์˜ 2-์นœ๊ตฌ๋ฅผ ๊ตฌํ•˜๋ฉด ๋œ๋‹ค. ์–ด๋–ค ์‚ฌ๋žŒ A๊ฐ€ ๋˜๋‹ค๋ฅธ ์‚ฌ๋žŒ B์˜ 2-์นœ๊ตฌ๊ฐ€ ๋˜๊ธฐ ์œ„ํ•ด์„ , ๋‘ ์‚ฌ๋žŒ

www.acmicpc.net

 

๋ฌธ์ œ

์ง€๋ฏผ์ด๋Š” ์„ธ๊ณ„์—์„œ ๊ฐ€์žฅ ์œ ๋ช…ํ•œ ์‚ฌ๋žŒ์ด ๋ˆ„๊ตฌ์ธ์ง€ ๊ถ๊ธˆํ•ด์กŒ๋‹ค. ๊ฐ€์žฅ ์œ ๋ช…ํ•œ ์‚ฌ๋žŒ์„ ๊ตฌํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๊ฐ ์‚ฌ๋žŒ์˜ 2-์นœ๊ตฌ๋ฅผ ๊ตฌํ•˜๋ฉด ๋œ๋‹ค. ์–ด๋–ค ์‚ฌ๋žŒ A๊ฐ€ ๋˜๋‹ค๋ฅธ ์‚ฌ๋žŒ B์˜ 2-์นœ๊ตฌ๊ฐ€ ๋˜๊ธฐ ์œ„ํ•ด์„ , ๋‘ ์‚ฌ๋žŒ์ด ์นœ๊ตฌ์ด๊ฑฐ๋‚˜, A์™€ ์นœ๊ตฌ์ด๊ณ , B์™€ ์นœ๊ตฌ์ธ C๊ฐ€ ์กด์žฌํ•ด์•ผ ๋œ๋‹ค. ์—ฌ๊ธฐ์„œ ๊ฐ€์žฅ ์œ ๋ช…ํ•œ ์‚ฌ๋žŒ์€ 2-์นœ๊ตฌ์˜ ์ˆ˜๊ฐ€ ๊ฐ€์žฅ ๋งŽ์€ ์‚ฌ๋žŒ์ด๋‹ค. ๊ฐ€์žฅ ์œ ๋ช…ํ•œ ์‚ฌ๋žŒ์˜ 2-์นœ๊ตฌ์˜ ์ˆ˜๋ฅผ ์ถœ๋ ฅํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.

A์™€ B๊ฐ€ ์นœ๊ตฌ๋ฉด, B์™€ A๋„ ์นœ๊ตฌ์ด๊ณ , A์™€ A๋Š” ์นœ๊ตฌ๊ฐ€ ์•„๋‹ˆ๋‹ค.

์ž…๋ ฅ

์ฒซ์งธ ์ค„์— ์‚ฌ๋žŒ์˜ ์ˆ˜ N์ด ์ฃผ์–ด์ง„๋‹ค. N์€ 50๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์€ ์ž์—ฐ์ˆ˜์ด๋‹ค. ๋‘˜์งธ ์ค„๋ถ€ํ„ฐ N๊ฐœ์˜ ์ค„์— ๊ฐ ์‚ฌ๋žŒ์ด ์นœ๊ตฌ์ด๋ฉด Y, ์•„๋‹ˆ๋ฉด N์ด ์ฃผ์–ด์ง„๋‹ค.

์ถœ๋ ฅ

์ฒซ์งธ ์ค„์— ๊ฐ€์žฅ ์œ ๋ช…ํ•œ ์‚ฌ๋žŒ์˜ 2-์นœ๊ตฌ์˜ ์ˆ˜๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.

 

์–ด๋ฆผ๋„ ์—†๋Š” ํ’€์ด 1 

๊ฒน์ง€์ธ์„.. ์ƒ๊ฐํ•˜์ง€ ๋ชปํ–ˆ๋‹ค.. ์˜ˆ์ œ3๋ฒˆ๋งŒ ๋ณด๊ณ .. ์‹ ๋‚˜๊ฒŒ ํ’€์—ˆ๋‹ค

์˜ˆ์ œ1๋„ ํ‹€๋ฆฌ๋Š” ์ฝ”๋“œ๋ฅผ ๋งŒ๋“ค์—ˆ๋‹ค

#include <iostream>
#include <vector>

using namespace std;

int main() {
    
    //์„ธํŒ…
    int n;
    cin >> n;
    vector <int> arr[n];
    int one[n], two[n];
    
    //์ž…๋ ฅ
    for(int i=0; i<n; i++){
        for(int j=0; j<n; j++){
            char tmp;
            cin >> tmp;
            if(tmp == 'Y'){
                arr[i].push_back(j);
            }
        }
    }
    
    //1-์นœ๊ตฌ ์ˆ˜ ๊ตฌํ•ด์„œ ๋ฐฐ์—ด์— ๋„ฃ๊ธฐ
    for(int i=0; i<n; i++){
        one[i] = arr[i].size();
    }
    
    //2-์นœ๊ตฌ ์ˆ˜ ๊ตฌํ•ด์„œ ๋ฐฐ์—ด์— ๋„ฃ๊ธฐ
    for(int i=0; i<n; i++){
        two[i] = one[i]; //2-์นœ๊ตฌ๋Š” ๋ณธ์ธ์˜ 1-์นœ๊ตฌ ์ˆ˜ +
        for(int j=0; j<arr[i].size(); j++){
            two[i] += one[i] - 1; // + ๋ณธ์ธ์˜ 1์นœ๊ตฌ๋“ค์˜ 1์นœ๊ตฌ ์ˆ˜ -1
        }
    }
    
    //์ถœ๋ ฅ
    int tmp = 0;
    for(int i=0; i<n; i++){
        if(tmp < two[i])
            tmp = two[i];
    }
    cout << tmp;
    
    return 0;
}

 

์–ด๋ฆผ๋„์—†๋Š”ํ’€์ด 2

DFS๋กœ ํ’€์—ˆ๋‹ค.

์˜ˆ์ œ๋Š” ๋‹ค ํ’€๋ฆผ

๊ทผ๋ฐ ์™œ ํ‹€๋ ธ์Šต๋‹ˆ๋‹ค๋ƒ๊ณ 

#include <iostream>
#include <algorithm>

using namespace std;

int n;  //์‚ฌ๋žŒ ์ˆ˜
bool arr[51][51] = {false}; //์นœ๊ตฌ๊ด€๊ณ„๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์ธ์ ‘๋ฐฐ์—ด
bool visited[51]; //๋ฐฉ๋ฌธํ•œ ๋…ธ๋“œ ํ‘œ์‹œํ•˜๊ธฐ
int ans[51] = {0}; //i๋ฒˆ์งธ ์‚ฌ๋žŒ์˜ 2-์นœ๊ตฌ ์ˆ˜

//๊นŠ์ด 2๊นŒ์ง€ ๋Œ์•„๊ฐ€๋Š” dfs
void dfs (int level, int i){
    
    visited[i] = true;
    
    if(level == 2) return;
    
    for(int j=0; j<n; j++){
        if(arr[i][j] && !visited[j]){ //์ธ์ ‘ํ•œ๋ฐ ๋ฐฉ๋ฌธ ์•ˆ๋˜์–ด์žˆ์œผ๋ฉด
            dfs(level+1, j);
        }
    }
}

int main() {
    
    //์ž…๋ ฅ๋ฐ›๊ธฐ
    cin >> n;
    char tmp;
    for(int i=0; i<n; i++){
        for(int j=0; j<n; j++){
            cin >> tmp;
            if(tmp == 'Y') arr[i][j] = true;
        }
    }
    
    //๊ฐ ์‚ฌ๋žŒ์—์„œ ์ถœ๋ฐœํ•ด์„œ
    for(int i=0; i<n; i++){
        
        //์ดˆ๊ธฐํ™”ํ•˜๊ณ 
        int cnt = 0;
        for(int j=0; j<51; j++){
            visited[j] = false;
        }
        
        //๊นŠ์ด 2๋งŒํผ dfs ๋Œ๋ฆฌ๊ณ 
        dfs(0,i);
        
        //๋ฐฉ๋ฌธ ํ‘œ์‹œ๋œ ๋…ธ๋“œ ๊ฐœ์ˆ˜ ์„ธ๋ฉด
        for(int j=0; j<n; j++){
            if(visited[j])
                cnt++;
        }
        
        //2-์นœ๊ตฌ ์ˆ˜๊ฐ€ ๋‚˜์˜ด
        ans[i] = cnt-1; //๋ณธ์ธ์€ ๋นผ์•ผํ•จ (-1)
    }
    
    //๋‹ต ๋ฐฐ์—ด์—์„œ ๊ฐ€์žฅ ํฐ ์ˆ˜ ๊ณ ๋ฅด๊ธฐ
    sort(ans, ans+51);
    cout << ans[50];
    
    
    return 0;
}

https://www.acmicpc.net/board/view/44710

 

๊ธ€ ์ฝ๊ธฐ - ๋ฐ˜๋ก€ ๋ง์”€ํ•ด์ฃผ์‹œ๋ฉด ๊ฐ์‚ฌํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

๋Œ“๊ธ€์„ ์ž‘์„ฑํ•˜๋ ค๋ฉด ๋กœ๊ทธ์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

www.acmicpc.net

๋‚˜๋ž‘ ๊ฐ™์€ ๋ฐฉ๋ฒ•์œผ๋กœ ํ‘ธ์‹  ๋ถ„์˜ ์งˆ์˜์‘๋‹ต์„ ๋ณด๊ณ  ์•Œ์•˜๋‹ค..

๊ธฐ๊ฐ€๋ง‰ํžˆ๊ฒŒ ์—ฌ๊ธฐ ๋‹ต๋ณ€์ž๋ถ„๊ป˜์„œ ์ œ์‹œํ•ด์ฃผ์‹  ์˜ˆ์ œ๊ฐ€ ๋”ฑ ํ‹€๋ฆฌ๋”๋ผ....

 

์•Œ๊ณ ๋ณด๋‹ˆ

๋ฐฉ๋ฌธ์ฒ˜๋ฆฌ๊ฐ€ ๋˜์–ด๋ฒ„๋ฆฌ๋ฉด bfs๋ฅผ ๋Œ๋ฆฌ๋‹ค๊ฐ€ ๋ฉˆ์ถ”๊ณ  ์žˆ์—ˆ๋‹ค

 

๊ทธ๋ž˜์„œ..

 

(์ง„์งœ) ํ’€์ด 

๋ฐฉ๋ฌธ์ฒ˜๋ฆฌ ์—†์ด ์ธ์ ‘๋ฐฐ์—ด์„ ๋‹ค ๋Œ ์ˆ˜ ์žˆ๊ฒŒ ๋ฒกํ„ฐ๋กœ ๋ฐ”๊ฟจ๋‹ค

๊ทธ๋ฆฌ๊ณ .. ์ด๊ฑด BFS ๋„ ์•„๋‹ˆ๊ณ  DFS ๋„ ์•„๋‹Œ

๋ญ”๊ฐ€ ๋‘˜์ด ์„ž์ธ

์˜ค๋ฌ˜ํ•œ... ์ด์ƒํ•œ ์• ๊ฐ€ ๋˜์—ˆ๋‹ค

๋Œ€์ถฉ B๋ž‘ D ์‚ฌ์ด์— ์žˆ๋Š” ํ’€์ด๋ฒ•์ด๋‹ˆ

CFS ๋ผ๊ณ  ํ•˜์ž ใ…Žใ…‹ใ…Ž

ํ ์—†์ด BFS ๊ตฌํ˜„ํ•œ ๋Š๋‚Œ..?!

#include <iostream>
#include <algorithm>
#include <vector>

using namespace std;

int n;  //์‚ฌ๋žŒ ์ˆ˜
vector <int> arr[51]; //์นœ๊ตฌ๊ด€๊ณ„๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์ธ์ ‘๋ฐฐ์—ด
bool visited[51];   //๋ฐฉ๋ฌธ์—ฌ๋ถ€
int ans[51] = {0}; //i๋ฒˆ์งธ ์‚ฌ๋žŒ์˜ 2-์นœ๊ตฌ ์ˆ˜

//๊นŠ์ด 2๊นŒ์ง€ ๋Œ์•„๊ฐ€๋Š” dfs
void dfs (int level, int i){
    
    visited[i] = true;
    
    if(level == 2) return;
    
    for(int j=0; j<arr[i].size(); j++){
        dfs(level+1, arr[i][j]);
    }
}

int main() {
    
    //์ž…๋ ฅ๋ฐ›๊ธฐ
    cin >> n;
    char tmp;
    for(int i=0; i<n; i++){
        for(int j=0; j<n; j++){
            cin >> tmp;
            if(tmp == 'Y') arr[i].push_back(j);
        }
    }
    
    //๊ฐ ์‚ฌ๋žŒ์—์„œ ์ถœ๋ฐœํ•ด์„œ
    for(int i=0; i<n; i++){
        
        //์ดˆ๊ธฐํ™”ํ•˜๊ณ 
        int cnt = 0;
        for(int j=0; j<51; j++){
            visited[j] = false;
        }
        
        //๊นŠ์ด 2๋งŒํผ dfs ๋Œ๋ฆฌ๊ณ 
        dfs(0,i);
        
        //๋ฐฉ๋ฌธ ํ‘œ์‹œ๋œ ๋…ธ๋“œ ๊ฐœ์ˆ˜ ์„ธ๋ฉด
        for(int j=0; j<n; j++){
            if(visited[j])
                cnt++;
        }
        
        //2-์นœ๊ตฌ ์ˆ˜๊ฐ€ ๋‚˜์˜ด
        ans[i] = cnt-1; //๋ณธ์ธ์€ ๋นผ์•ผํ•จ (-1)
    }
    
    //๋‹ต ๋ฐฐ์—ด์—์„œ ๊ฐ€์žฅ ํฐ ์ˆ˜ ๊ณ ๋ฅด๊ธฐ
    sort(ans, ans+51);
    cout << ans[50];
    
    
    return 0;
}

 

๊ทธ๋ฆฌ๊ณ ...

๊ทธ๋ƒฅ ์˜ฌ๋ฆฌ๋Š” ์•Œ์•„๋ณผ์ˆ˜์—†๋Š” ํ’€์ด๋“ค

๊ฐ์ž ํ’€์ด 1 2 3์ด๋‹ค

 

๋ฐ˜์‘ํ˜•