algorithm

BOJ 5021

rkawk 2022. 10. 10. 19:45

๋ฌธ์ œ

๋”๋ณด๊ธฐ

์™•์œ„ ๊ณ„์Šน ์„ฑ๊ณต๋‹ค๊ตญ์–ด

ํ•œ๊ตญ์–ด   
1 ์ดˆ 128 MB 1005 340 255 34.884%

๋ฌธ์ œ

์œ ํ† ํ”ผ์•„์˜ ์™•์ด ์‚ฌ๋งํ–ˆ๋‹ค. ์™•์€ ์ž์†์„ ๋‚จ๊ธฐ์ง€ ์•Š๊ณ  ์‚ฌ๋งํ–ˆ๊ธฐ ๋•Œ๋ฌธ์—, ์™•์œ„๋ฅผ ๊ณ„์Šนํ•  ์‚ฌ๋žŒ์„ ์ง€๋ชฉํ•˜์ง€ ์•Š์•˜๋‹ค. ์™•์‹ค ๊ท€์กฑ์€ ์™•์œ„๋ฅผ ์ฃผ์žฅํ•˜๊ธฐ ์‹œ์ž‘ํ–ˆ๋‹ค. ์œ ํ† ํ”ผ์•„์˜ ๋ฒ•์—๋Š” ์™•์˜ ๊ณ„์Šน์ž๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ์—, ๋‚˜๋ผ๋ฅผ ์„ธ์šด ์‚ฌ๋žŒ๊ณผ ํ˜ˆํ†ต์ด ๊ฐ€๊นŒ์šด ์‚ฌ๋žŒ์ด ์œ ํ† ํ”ผ์•„๋ฅผ ํ†ต์น˜ํ•œ๋‹ค๋Š” ์กฐํ•ญ์ด ์žˆ๋‹ค.

๋‚˜๋ผ๋ฅผ ์„ธ์šด ์‚ฌ๋žŒ๊ณผ ํ˜ˆํ†ต์ด ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ์‚ฌ๋žŒ์€ ๊ทธ์˜ ์ž์†์ด ์•„๋‹Œ ์‚ฌ๋žŒ๊ณผ ํ”ผ๊ฐ€ ๋œ ์„ž์ธ ์‚ฌ๋žŒ์ด๋‹ค. ๋ชจ๋“  ์‚ฌ๋žŒ์€ ์•„๋ฒ„์ง€์˜ ํ˜ˆํ†ต๊ณผ ์–ด๋จธ๋‹ˆ์˜ ํ˜ˆํ†ต์„ ๋ฐ˜ ์”ฉ ๋ฐ›๊ฒŒ ๋œ๋‹ค. ๋‚˜๋ผ๋ฅผ ์„ธ์šด ์‚ฌ๋žŒ์˜ ์ž์‹์€ 1/2 ์™•์กฑ์ด๋ฉฐ, ๊ทธ ์•„๋“ค์ด ์™•์กฑ์ด ์•„๋‹Œ ์‚ฌ๋žŒ๊ณผ ๊ฒฐํ˜ผํ•œ ๊ฒฝ์šฐ์—๋Š” ์•„๋“ค์˜ ์ž์‹์€ 1/4 ์™•์กฑ์ด ๋œ๋‹ค.

๊ฐ€์žฅ ๋‚˜๋ผ๋ฅผ ์„ธ์šด ์‚ฌ๋žŒ๊ณผ ํ˜ˆํ†ต์ด ๊ฐ€๊นŒ์šด ์‚ฌ๋žŒ์„ ์ฐพ๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค. 

์ž…๋ ฅ

์ฒซ์งธ ์ค„์— N๊ณผ M์ด ์ฃผ์–ด์ง„๋‹ค. (2 ≤ N, M ≤ 50)

๋‘˜์งธ ์ค„์— ์œ ํ† ํ”ผ์•„๋ฅผ ์„ธ์šด ์‚ฌ๋žŒ์˜ ์ด๋ฆ„์ด ์ฃผ์–ด์ง„๋‹ค.

๋‹ค์Œ N๊ฐœ ์ค„์—๋Š” ๊ฐ€์กฑ ์ •๋ณด๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ์ •๋ณด๋Š” ์ด๋ฆ„ ์„ธ ๊ฐœ๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๊ณ , ๊ณต๋ฐฑ์œผ๋กœ ๊ตฌ๋ถ„๋˜์–ด์ ธ ์žˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ ์ด๋ฆ„์€ ์ž์‹์˜ ์ด๋ฆ„์ด๊ณ , ๋’ค์˜ ๋‘ ์ด๋ฆ„์€ ๋ถ€๋ชจ์˜ ์ด๋ฆ„์ด๋‹ค.

๋‹ค์Œ M๊ฐœ ์ค„์—๋Š” ์™•์œ„๋ฅผ ๊ณ„์Šน๋ฐ›๊ธฐ๋ฅผ ์ฃผ์žฅํ•˜๋Š” ์‚ฌ๋žŒ์˜ ์ด๋ฆ„์ด ํ•œ ์ค„์— ํ•˜๋‚˜์”ฉ ์ฃผ์–ด์ง„๋‹ค.

๋ชจ๋“  ์ด๋ฆ„์€ 1~10๊ธ€์ž์ด๋ฉฐ, ์•ŒํŒŒ๋ฒณ ์†Œ๋ฌธ์ž๋กœ๋งŒ ์ด๋ฃจ์–ด์ ธ ์žˆ๋‹ค. ๋‚˜๋ผ๋ฅผ ์„ธ์šด ์‚ฌ๋žŒ์ด ์™•์œ„๋ฅผ ๊ณ„์Šนํ•˜๋Š” ๊ฒฝ์šฐ๋‚˜, ๋ˆ„๊ตฐ๊ฐ€์˜ ์ž์‹์ธ ๊ฒฝ์šฐ๋Š” ์—†๋‹ค. 

์ถœ๋ ฅ

์ฒซ์งธ ์ค„์— ์œ ํ† ํ”ผ์•„๋ฅผ ์„ธ์šด ์‚ฌ๋žŒ๊ณผ ๊ฐ€์žฅ ํ˜ˆํ†ต์ด ๊ฐ€๊นŒ์šด ์‚ฌ๋žŒ์˜ ์ด๋ฆ„์„ ์ถœ๋ ฅํ•œ๋‹ค. ํ•ญ์ƒ ๋‹ต์ด ์œ ์ผํ•œ ๊ฒฝ์šฐ๋งŒ ์ž…๋ ฅ์œผ๋กœ ์ฃผ์–ด์ง„๋‹ค.

๋ฌธ์ œ์— ์ฃผ์–ด์ง€๋Š” ๊ฐ€์กฑ ๊ด€๊ณ„๋Š” ์„ฑ๋ณ„, ๋‚˜์ด๋ฅผ ๊ณ ๋ คํ•˜์ง€ ์•Š๊ณ  ๋งŒ๋“ค์—ˆ๊ธฐ ๋•Œ๋ฌธ์—, ์‹ค์ œ๋กœ๋Š” ๋ง์ด ์•ˆ๋˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋‚˜์˜ฌ ์ˆ˜๋„ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ, ๋ชจ๋“  ์ž์‹์˜ ๋ถ€๋ชจ๋Š” ์œ ์ผํ•˜๋ฉฐ, ๋‹ค์‹œ ์ž์‹์ด ๋ถ€๋ชจ์˜ ๋ถ€๋ชจ๊ฐ€ ๋˜๋Š” ๊ฒฝ์šฐ๋„ ์—†๋‹ค. ๋˜, ํ•œ ์‚ฌ๋žŒ์ด ์—ฌ๋Ÿฌ ๋ช…์˜ ์ž์‹์ด ๋  ์ˆ˜ ๋„ ์—†๋‹ค.

์˜ˆ์ œ ์ž…๋ ฅ 1 ๋ณต์‚ฌ

9 2
edwardi
charlesi edwardi diana
philip charlesi mistress
wilhelm mary philip
matthew wilhelm helen
edwardii charlesi laura
alice laura charlesi
helen alice bernard
henrii edwardii roxane
charlesii elizabeth henrii
charlesii
matthew

์˜ˆ์ œ ์ถœ๋ ฅ 1 ๋ณต์‚ฌ

matthew

์˜ˆ์ œ ์ž…๋ ฅ 2 ๋ณต์‚ฌ

4 5
andrew
betsy andrew flora
carol andrew betsy
dora andrew carol
elena andrew dora
carol
dora
elena
flora
gloria

์˜ˆ์ œ ์ถœ๋ ฅ 2 ๋ณต์‚ฌ

elenaโ€‹

ํ’€์ด

ํ’€์ด ์ž์ฒด๋Š” ๊ฐ„๋‹จํ•˜๋‹ค. 

๋ฌธ์ œ์—์„œ ๋ช…์‹œ๋˜์–ด ์žˆ์ง€๋Š” ์•Š์ง€๋งŒ ๋ถ€๋ชจ ๋‘˜์„ ์•„๋ฒ„์ง€, ์–ด๋จธ๋‹ˆ๋กœ ๋‘๊ณ 

(์•„๋ฒ„์ง€์˜ ํ˜ˆํ†ต๊ฐ’ + ์–ด๋จธ๋‹ˆ์˜ ํ˜ˆํ†ต๊ฐ’) * 1/2 ๋ฅผ ํ•œ ๊ฐ’์ด ์ž๋…€์˜ ํ˜ˆํ†ต์˜ ๊ฐ’์ด ๋œ๋‹ค.

์ด๋ฅผ ๋ชจ๋“  ์ž๋…€์— ๋Œ€ํ•ด ๊ณ„์‚ฐํ•ด์ฃผ๋ฉด ๋˜๋Š” ๋ฌธ์ œ์ด๋‹ค.

 

์ž๋…€์™€ ๋ถ€๋ชจ์— ๋Œ€ํ•œ ์ •๋ณด๊ฐ€ ํ•œ๋ฒˆ์— ์ž…๋ ฅ๋˜๋ฏ€๋กœ ๊ตฌ์กฐ์ฒด๋กœ ์„ ์–ธํ•ด์ค€๋‹ค.

struct p{
    string name, parent1, parent2;
};

๊ทธ๋ฆฌ๊ณ  ๊ฐ๊ฐ์˜ ๋…ธ๋“œ(์ž๋…€, ๋ถ€๋ชจ ๊ฐ๊ฐ์˜ ์ด๋ฆ„) ์˜ ํ˜ˆํ†ต์„ ์ดˆ๊ธฐํ™”ํ•ด์ฃผ๊ธฐ ์œ„ํ•ด key-value table์„ ์ƒ์„ฑํ•ด์ค€๋‹ค.

๋ถ€๋ชจ์™€ ์ž๋…€์˜ ์ด๋ฆ„์ด ์ค‘๋ณต๋  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ์ค‘๋ณต์ผ ๊ฒฝ์šฐ์— insert๋ฅผ ์ œํ•œํ•˜๋Š” map stl์„ ์‚ฌ์šฉํ•˜์˜€๋‹ค.

 

map<string,double>m;

 

์„ค๋ฆฝ์ž์˜ ํ˜ˆํ†ต์€ 1๋กœ ์ดˆ๊ธฐํ™” ํ•ด์ฃผ๊ณ , ๋‚˜๋จธ์ง€๋Š” ๋‹ค 0์œผ๋กœ ์ดˆ๊ธฐํ™” ํ•ด์ค€๋‹ค.

cin>>founder;
    m.insert({founder, 1});
    for(int i=0; i<N; i++){
        p new_p;
        cin>>new_p.name>>new_p.parent1>>new_p.parent2;
        v.push_back(new_p);
        m.insert({new_p.name, 0});
        m.insert({new_p.parent1, 0});
        m.insert({new_p.parent2, 0});
    }

ํ˜ˆํ†ต์ด 0์ด ์•„๋‹Œ ๊ฒฝ์šฐ๋Š” ๋ฌด์กฐ๊ฑด ์„ค๋ฆฝ์ž์™€ ํ˜ˆ์—ฐ๊ด€๊ณ„๊ฐ€ ์žˆ์–ด์•ผ ํ•˜๋ฏ€๋กœ queue๋ฅผ ํ•˜๋‚˜ ๋งŒ๋“ค์–ด ์„ค๋ฆฝ์ž๋ฅผ ๋„ฃ์–ด์ฃผ๊ณ ,

๋ถ€๋ชจ๊ฐ€ ์„ค๋ฆฝ์ž์ธ ๊ฒฝ์šฐ๋ถ€ํ„ฐ ํƒ์ƒ‰ํ•ด ๋‚˜๊ฐ€๋„๋ก ํ–ˆ๋‹ค.

๋‘๋ช…์˜ ๋ถ€๋ชจ ์ค‘ ํ•˜๋‚˜๋ผ๋„ ์„ค๋ฆฝ์ž์ด๋ฉด ํ˜ˆ์—ฐ๊ด€๊ณ„๋ฅผ ๊ณ„์‚ฐํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์ด์–ด์ง€๋Š” ๊ฒƒ์ด๋‹ค.

๋‹ค๋งŒ ์„ค๋ฆฝ์ž์˜ ์ž๋…€๊ฐ€ ์„ค๋ฆฝ์ž์˜ ๋ฐฐ์šฐ์ž๊ฐ€ ๋˜๋“ฏ์ด ์„ค๋ฆฝ์ž์™€ ํ˜ˆ์—ฐ๊ด€๊ณ„๊ฐ€ ์žˆ๋Š” ์‚ฌ๋žŒ์ด ์„ค๋ฆฝ์ž์™€ ํ˜ˆ์—ฐ๊ด€๊ณ„๊ฐ€ ์žˆ๋Š” ์‚ฌ๋žŒ์˜ ๋ฐฐ์šฐ์ž๊ฐ€ ๋  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์„ค๋ฆฝ์ž์˜ ์ž๋…€, ์„ค๋ฆฝ์ž์˜ ์ž๋…€์˜ ์ž๋…€ ~~~ ๋ฅผ queue์— ๊ณ„์† ๋„ฃ์–ด์ฃผ๋ฉด์„œ ๊ณ„์‚ฐ์ด ๋ฐ”๋€Œ๋Š” ๊ฒฝ์šฐ๋„ ๋ชจ๋‘ ํƒ์ƒ‰ํ•ด ์ฃผ๋„๋ก ํ–ˆ๋”ฐ.

queue<string>q;
    q.push(founder);
    while(!q.empty()){
        string cur = q.front();
        q.pop();
        for(auto node : v){
            if(node.parent1 == cur || node.parent2 == cur){
                string p1 = node.parent1, p2 = node.parent2;
                double p1_rate = m.find(p1)->second, p2_rate = m.find(p2)->second;
                m.find(node.name)->second = (p1_rate+p2_rate)/2;
                q.push(node.name);
            }
        }
    }

์ด๋Ÿฌ๋ฉด ๋ชจ๋“  ์‚ฌ๋žŒ์˜ ํ˜ˆ์—ฐ๊ด€๊ณ„๊ฐ€ ๊ตฌํ•ด์ง€๊ฒŒ ๋˜๊ณ , ๋ฌธ์ œ๊ฐ€ ํ’€๋ฆฐ๋‹ค.

 

๋‹ค๋ฅธ ํ’€์ด

๋‹ค ํ’€๊ณ  ๋‹ค๋ฅธ ํ’€์ด๋ฅผ ์ฐพ์•„๋ณด์•˜์„๋•Œ

ํ›„๋ณด์ž๋ฅผ ์ž…๋ ฅํ•˜๋Š” ๊ฒฝ์šฐ์— DFS๋กœ ํƒ์ƒ‰ํ•˜๋Š” ๊ฒƒ์ด ๋” ์ฝ”๋“œ๊ฐ€ ๋ช…๋ฃŒํ•˜๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ฒŒ ๋˜์—ˆ๋‹ค.

 

๋ถ€๋ชจ์˜ ํ˜ˆ์—ฐ๊ด€๊ณ„๋ฅผ ๋ถ€๋ชจ์˜ ๋ถ€๋ชจ๊ฐ€ ์—†์„๋•Œ๊นŒ์ง€ ๊ณ„์‚ฐํ•ด ์ž๋…€๋ฅผ ๊ณ„์‚ฐํ•˜๋ฉด ๋œ๋‹ค.

double dfs(string s){
    for(auto node : v){
        if(node.name == s){
            string p1 = node.parent1, p2 = node.parent2;
            double rate = (dfs(p1)+dfs(p2))/2;
            m[s] = rate;
            return rate;
        }
    }
    return m[s];
}

์ด ์ฝ”๋“œ์—์„œ๋Š” ๊ตฌ์กฐ์ฒด ๋ฒกํ„ฐ v์˜ ์›์†Œ์˜ name์ด ์—†์œผ๋ฉด ๋ถ€๋ชจ๊ฐ€ ์—†๋Š” ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์—, ๊ทธ๋•Œ map์˜ ์›์†Œ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋„๋ก ํ–ˆ๋‹ค.

 

์ „์ฒด ์ฝ”๋“œ

#include <iostream>
#include <vector>
#include <string>
#include <queue>
#include <map>
using namespace std;
struct p{
    string name, parent1, parent2;
};
map<string,double>m;
vector<p>v;
int N, M;
double ans;
string founder, ans_s;
int main(){
    ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
    cin>>N>>M;
    cin>>founder;
    m.insert({founder, 1});
    for(int i=0; i<N; i++){
        p new_p;
        cin>>new_p.name>>new_p.parent1>>new_p.parent2;
        v.push_back(new_p);
        m.insert({new_p.name, 0});
        m.insert({new_p.parent1, 0});
        m.insert({new_p.parent2, 0});
    }
    queue<string>q;
    q.push(founder);
    while(!q.empty()){
        string cur = q.front();
        q.pop();
        for(auto node : v){
            if(node.parent1 == cur || node.parent2 == cur){
                string p1 = node.parent1, p2 = node.parent2;
                double p1_rate = m.find(p1)->second, p2_rate = m.find(p2)->second;
                m.find(node.name)->second = (p1_rate+p2_rate)/2;
                q.push(node.name);
            }
        }
    }
    for(int i=0; i<M; i++){
        string s1;
        cin>>s1;
        for(auto iter = m.begin(); iter != m.end(); iter++){
            if(iter->first == s1){
                if(iter->second > ans){
                    ans = iter->second;
                    ans_s = iter->first;
                }
            }
        }
    }
    cout<<ans_s;
    
}
#include <iostream>
#include <vector>
#include <string>
#include <queue>
#include <map>
using namespace std;
struct p{
    string name, parent1, parent2;
};
map<string,double>m;
vector<p>v;
int N, M;
double ans;
string founder, ans_s;
double dfs(string s){
    for(auto node : v){
        if(node.name == s){
            string p1 = node.parent1, p2 = node.parent2;
            double rate = (dfs(p1)+dfs(p2))/2;
            m[s] = rate;
            return rate;
        }
    }
    return m[s];
}
int main(){
    ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
    cin>>N>>M;
    cin>>founder;
    m.insert({founder, 1});
    for(int i=0; i<N; i++){
        p new_p;
        cin>>new_p.name>>new_p.parent1>>new_p.parent2;
        v.push_back(new_p);
        m.insert({new_p.name, 0});
        m.insert({new_p.parent1, 0});
        m.insert({new_p.parent2, 0});
    }
    for(int i=0; i<M; i++){
        string s1;
        cin>>s1;
        double r=dfs(s1);
        if(r > ans){
            ans_s = s1;
            ans = r;
        }
    }
    cout<<ans_s;
    
}

 

ํฌ์ธํŠธ

ํ˜ˆ์—ฐ๊ด€๊ณ„์™€ ๊ด€๋ จ๋œ ๋ชจ๋“  ๋ณ€์ˆ˜๋Š” double๋กœ ์ƒ์„ฑํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค.

ans๋ณ€์ˆ˜๋ฅผ int๋กœ ์ƒ์„ฑํ•ด์„œ ๋‘๋ฒˆ ํ‹€๋ ธ๋‹ค.

 

map stl์˜ findํ•จ์ˆ˜๊ฐ€ key๋ฅผ ์ฐพ์ง€ ๋ชปํ–ˆ์„ ๊ฒฝ์šฐ, map.end()๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์ƒ๊ธฐํ•˜์ž.

map.end()๋Š” ๋งˆ์ง€๋ง‰ ์›์†Œ๋ฅผ ์ฐธ์กฐํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹Œ ๋ฐ˜๋ณต์ž์˜ ๋งˆ์ง€๋ง‰์„ ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ฒƒ์ด๋‹ค.

'algorithm' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

BOJ 1445  (1) 2022.10.13
BOJ 2056  (2) 2022.10.10
BOJ 20056  (0) 2022.10.09
BOJ 1826  (0) 2022.10.07
BOJ 1174  (0) 2022.10.07