[백준/C++] 1620번 나는야 포켓몬 마스터 이다솜

2021. 2. 6. 00:23알고리즘/이분 탐색

728x90
반응형

문제: www.acmicpc.net/problem/1620

 

1620번: 나는야 포켓몬 마스터 이다솜

첫째 줄에는 도감에 수록되어 있는 포켓몬의 개수 N이랑 내가 맞춰야 하는 문제의 개수 M이 주어져. N과 M은 1보다 크거나 같고, 100,000보다 작거나 같은 자연수인데, 자연수가 뭔지는 알지? 모르면

www.acmicpc.net

 

 

문제풀이

 

이분 탐색 문제이다.

 

포켓몬 이름이 입력으로 들어오면 포켓몬의 번호를, 포켓몬의 번호가 입력으로 들어오면 포켓몬의 이름을 출력해야 한다.

 

벡터를 두 개 선언해서 하나는 포켓몬 이름을 저장하고 다른 하나는 번호와 이름을 같이 저장한다.

번호와 이름을 같이 저장한 벡터는 sort() 함수를 이용해 사전 순으로 정렬해준다.

 

문제에 대한 입력을 받을 때 string 형으로 받는데 이 문자열의 첫째 자리가 65 미만이면(아스키코드)

번호가 들어온 것으로 인지하고 int 형 변환한 후 첫 번째 벡터에서 포켓몬 이름을 출력한다.

 

반대로 문자열의 첫째 자리가 65 이상이라면 포켓몬 이름이 입력된 것으로 두 번째 벡터에서 이분 탐색 후 해당 이름의 포켓몬 번호를 출력한다.

 

 

코드

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

using namespace std;

bool compare_func(pair<int, string> &p1, pair<int, string> &p2){ //사전순 정렬
    if(p1.second.compare(p2.second) > 0)
        return true;
    else
        return false;
}

int binary_search(vector<pair<int, string>> &v, string str){ //이분 탐색
    int start=0;
    int end=v.size()-1;
    
    while(start<=end){
        int mid = (start+end)/2;
        
        int comp = v[mid].second.compare(str);
        if(comp == 0){
            return v[mid].first;
        }
        else if(comp > 0){
            start = mid+1;
        }
        else{
            end = mid-1;
        }
    }
}

int main(){
    ios::sync_with_stdio(false); cin.tie(nullptr);

    int N, M;
    cin>>N>>M;

    vector<string> v1;
    vector<pair<int, string>> v2;
    for(int i=0; i<N; i++){
        string str;
        cin>>str;
        v1.push_back(str); //벡터를 두개로 저장한다.
        v2.push_back({i+1, str});
    }

    sort(v2.begin(), v2.end(), compare_func); //두번째 벡터만 사전순 정렬

    for(int i=0; i<M; i++){
        string str;
        cin>>str;
        
        if(str[0]<65){ //문자열 첫째자리가 65 미만이면 이름을 아니면 번호를 출력한다.
            cout<<v1[stoi(str)-1]<<"\n";
        }
        else{
            cout<<binary_search(v2, str)<<"\n";
        }
    }
    return 0;
}

 

 

결과

 

이 문제를 풀면서 배운 것이 있는데

벡터를 vector<pair<int, string>> 이 아닌 vector<pair<string, int>> 로 선언했다면

compare_func() 함수를 따로 정의할 필요 없이

sort() 함수가 알아서 사전 순 정렬을 해준다는 것입니다.

728x90
반응형

'알고리즘 > 이분 탐색' 카테고리의 다른 글

[백준/C++] 1764번 듣보잡  (0) 2021.02.09
[백준/C++] 1920번 수 찾기  (0) 2021.02.01
[백준/C++] 2805번 나무 자르기  (0) 2021.01.29