ALGOSPOT MATCHORDER 알고스팟 출전 순서 정하기
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 | include<iostream> #include<vector> #include<string> #include<cstring> #include <algorithm> using namespace std; int N; //선수가 출전했는지 안했는지 여부 //1이면 출전함,0이면 출전안한 선수 bool visited[4001]; int Winner(vector<int> Russia, vector<int> korea) { int Winnum = 0; for (int i = 0; i < N; i++) { int low = 0; int high = N - 1; for (int k = N - 1; k >= 0; k--) { if (!visited[k]) { break; } high--; } for (int j = 0; j < N; j++) { if (!visited[j]) { break; } low++; } if (low == N) return Winnum; if (high == -1) return Winnum; if (Russia[i] > korea[high]) { visited[low] = true; } else { while ((Russia[i] > korea[low]) || visited[low]) { low++; } visited[low] = true; Winnum++; } } return Winnum; } int main(void) { int cases; cin >> cases; while (cases--) { memset(visited, 0, sizeof(visited)); cin >> N; vector<int> Russia(N); vector<int> korea(N); for (int i = 0; i < N; i++) cin >> Russia[i]; for (int i = 0; i < N; i++) cin >> korea[i]; sort(korea.begin(), korea.end()); cout<<Winner(Russia, korea)<<endl; } return 0; } | cs |
이 코드는 책의 문제답안을 보기전 작성한 코드이다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 | #include<iostream> #include<vector> #include<string> #include<cstring> #include <algorithm> #include<set> using namespace std; int N; int Winner(const vector<int>& russian, const vector<int> & korean) { int n = russian.size(), wins = 0; //아직 남아 있는 선수들의 레이팅 multiset<int> ratings(korean.begin(), korean.end()); for (int rus = 0; rus < n; rus++) { //가장 레이팅이 높은 한국 선수가 이길 수 없는 경우 //가장 레이팅이 낮은 선수와 경기시킨다. if (*ratings.rbegin() < russian[rus]) ratings.erase(ratings.begin()); //이 외의 경우 이길 수 있는 선수 중 가장 레이팅이 낮은 선수와 경기시킨다. else { ratings.erase(ratings.lower_bound(russian[rus])); wins++; } } return wins; } int main(void) { int cases; cin >> cases; while (cases--) { cin >> N; vector<int> Russia(N); vector<int> korea(N); for (int i = 0; i < N; i++) cin >> Russia[i]; for (int i = 0; i < N; i++) cin >> korea[i]; cout<<Winner(Russia, korea)<<endl; } return 0; } | cs |
문제 출처:https://algospot.com/judge/problem/read/MATCHORDER
난이도는 쉬운 문제지만 처음보는 함수를 사용하네요 multiset<int> 활용하는 법을 익히면 좋을 것 같습니다.
따로 sort함수를 사용해서 vector korea를 정렬시키지 않았음에도 문제없이 잘 돌아가네요.
'알고리즘 > 알고리즘 문제 해결전략(종만북)' 카테고리의 다른 글
ALGOSPOT STRJOIN 알고스팟 문자열 합치기 (0) | 2019.01.24 |
---|---|
ALGOSPOT LUNCHBOX 알고스팟 도시락 데우기 (0) | 2019.01.23 |
ALGOSPOT PI 알고스팟 파이 (0) | 2019.01.23 |
ALGOSPOT JLIS 알고스팟 합친 LIS (0) | 2019.01.23 |
ALGOSPOT LIS 알고스팟 최대 증가 부분 수열 (0) | 2019.01.22 |