1. 풀이방법
- 포켓몬도감을 입력받아 찾으면 되는 문제입니다.
- 첫번쨰 문제는 입력이 숫자 일수도, 포켓몬 이름 일수도 있다는 것입니다.
- 이름의 경우 알파벳만으로 이루어져있다고 했으므로, 입력받은 문자열의 첫글자가 알파벳인지 숫자인지만
- 구분해서 구하여주었습니다.
2. 주의사항
- 처음에 그냥 선형탐색으로 짰는데, 이 경우 최대연산 수가 대략 10,000,000,000이 되므로 시간조건을 만족x
- 결국 이분탐색을 이용하고자 하였고 그러려면 알파벳순으로 정렬을 해야 하는데 , 그러면
- index가 섞이기 때문에 따로 알파벳입력이 들어왔을 떄를 위한 index도 가지고 있는 배열을 선언하였습니다.
- 숫자가 들어올 경우 vector<string> 을 통해 index를 구해서 바로 접근 하였고,
- 알파벳으로 들어올 경우 vector<pair<string,int>> 를 정렬해놓은 것을 통해 이분 탐색으로 찾았습니다.
3. 나의코드
#include<iostream>
#include<algorithm>
#include<vector>
#include<string>
#include<queue>
using namespace std;
vector<string> dokam;
vector<pair<string, int>> dokamname; //알파벳이 입력되었을 경우 이분탐색을 위한 !
string tmps;
void find(int bot, int top) {
if(bot>top) return;
int mid = (bot + top) / 2;
if (tmps == dokamname[mid].first) { cout << dokamname[mid].second << '\n'; return; }
else if (tmps < dokamname[mid].first) { find(bot, mid - 1); }
else { find(mid + 1, top); }
}
bool compare(pair<string, int> &a, pair<string, int> &b) {
if (a.first < b.first) return true;
else return false;
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
int n, m;
cin >> n >> m;
for (int i = 1; i <= n; i++) {
string s;
cin >> s;
dokam.emplace_back(s);
dokamname.push_back({ s,i });
}
sort(dokamname.begin(), dokamname.end(), compare);
while (m--) {
int result = 0;
cin >> tmps;
if (tmps[0] >= '0'&&tmps[0] <= '9') { //숫자일경우
int deci = 1;
for (int i = tmps.length() - 1; i >= 0; i--) {
result += deci * (int)(tmps[i] - '0');
deci *= 10;
}
cout << dokam[result-1] << "\n";
}
else { //선형탐색으로는 시간초과 -> 이분탐색 진행
find(0,n-1);
}
}
return 0;
}
'알고리즘 문제풀이 > 정렬' 카테고리의 다른 글
백준 11652 [C++] (0) | 2021.01.26 |
---|---|
백준 2887 [C++] (0) | 2020.10.27 |
백준 10825 [C++] (0) | 2020.10.25 |
백준 10814 (0) | 2020.03.02 |
백준 1181 (0) | 2020.01.15 |