https://www.acmicpc.net/problem/1713
시뮬레이션 문제로, 문제에 제시된대로 구현하면 된다.
조금 까다로웠던 점은 사진틀이 비어있지 않을 때,
추천 회수가 적은 순으로하고 동일하면 이전에 추천 받은거를 빼줘야 하는 것이다.
우선 배열에 값을 저장하고 배열이 꽉 차 있으면 현재 추천받은 학생이 이전에 추천받은 적이 있는지,
만약 없다면 배열의 모든 값을 우선순위 큐에 집어넣은 다음에
가장 상위에 있는(추천 회수가 적고 이전에 추천받은) 번호를 빼준 다음에 배열에 값을 수정해줄수 있도록 했다.
deque로 문제를 풀 수 있을 거 같은데 아직 자료구조를 능숙하게 다루지 못하는거 같아서
다른 방식으로 문제를 해결하면 바로 업로드를 할 생각이다.
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 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 | #include <iostream> #include <queue> #include <vector> #include <algorithm> using namespace std; struct str { int num; int vote; int times; str(int num, int vote, int times) :num(num), vote(vote), times(times) {}; }; bool operator<(str s1, str s2) { //투표 적은 순, 동일하면 먼저 들어온 순으로 if (s1.vote == s2.vote) return s1.times > s2.times; else return s1.vote > s2.vote; } int main() { std::ios_base::sync_with_stdio(false); int photo_size; int T=0; cin >> photo_size >> T; int recommend_num=0; vector<int> exists(101, 0); //추천 유무 vector<str> vec; for (int testCase= 1; testCase <= T; testCase++) { cin >> recommend_num; //해당 후보 이전에 추천 받았을 때 if (exists[recommend_num]) { for (int i = 0; i < vec.size(); i++) { if (vec[i].num == recommend_num) { vec[i].vote += 1; //투표수 증가 break; } } continue; } exists[recommend_num]++; if ((int)vec.size() < photo_size) { //아직 사진틀 여유 있으면 vec.push_back(str(recommend_num, 1, testCase)); continue; } priority_queue<str> pq; for (int i = 0; i < vec.size(); i++) { pq.push(vec[i]); } str s = pq.top(); for (int i = 0; i < vec.size(); i++) { if (vec[i].num == s.num) { exists[s.num] = 0; vec[i].num = recommend_num; vec[i].vote = 1; vec[i].times = testCase; break; } } } vector<int> ans; for (int i = 0; i < vec.size(); i++) { ans.push_back(vec[i].num); } sort(ans.begin(), ans.end()); for (int i = 0; i < ans.size(); i++) cout << ans[i] << " "; return 0; } | cs |
'알고리즘(BOJ) > 시뮬레이션' 카테고리의 다른 글
백준 17144번 - 미세먼지 안녕! (0) | 2019.05.13 |
---|---|
백준 16235번 - 나무 재테크 (0) | 2019.05.10 |
백준 1018번 - 체스판 다시 칠하기 (0) | 2019.04.28 |
백준 2798번 - 블랙잭 (0) | 2019.04.28 |
백준 17135번 - 캐슬 디펜스 (0) | 2019.04.20 |