문제 링크 : https://www.acmicpc.net/problem/1713
1713번: 후보 추천하기
첫째 줄에는 사진틀의 개수 N이 주어진다. (1≤N≤20) 둘째 줄에는 전체 학생의 총 추천 횟수가 주어지고, 셋째 줄에는 추천받은 학생을 나타내는 번호가 빈 칸을 사이에 두고 추천받은 순서대로
www.acmicpc.net
이 문제에서 기억해둬야할 점은 다음과 같다.
1. n은 앨범의 순서, m은 추천을 받는 횟수이다. 학생의 번호는 1번 ~ 100번까지 존재한다.
2. 문제에서 언급한 사항들을 반드시 모두 지켜야한다.
이 문제를 풀기 위해 필요한 변수와 로직은 다음과 같이 구현했다.
로직만 이해한다면 코드를 하나하나 설명하지 않아도 되므로, 구체적인 설명은 생략한다.
[변수]
구조체 frame = 학생번호, 앨범 순서, 학생 점수
student [101] = 해당 번호 학생의 추천수를 뜻함
- 학생의 번호는 1~100까지 고정적으로 주어진다.
[알고리즘]
사진틀의 길이가 n보다 작다.
(1) 자신의 것이 있다면 점수만 업데이트하기
(2) 자신의 것이 없다면 벡터의 맨 뒤에 추가
사진틀의 길이가 n이상 이다.
(1) 자신이 것이 있으면 점수만 업데이트하기
(2) 자신의 것이 없다면
(2-1) 가장 작은 추천을 받은 학생(=frame[0])의 점수를 0으로 초기화
(2-2) 그 자리를 대체해서 들어간다.
[정렬]
comp1 = 추천수가 작은 순이 앞으로 옴.
추천수가 동일하면 사진틀에 더 오래전에 들어온 학생이 앞으로 옴.
- 이 정렬은 학생이 한 번 들어올때마다 사용해준다.
comp2 = 학생 번호가 작은 순으로 앞으로 옴 (정답을 출력할때 쓰임)
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
struct frame{
int number;
int order;
int score;
};
bool comp1(const frame &a, const frame &b){
if(a.score==b.score) return a.order<b.order;
else return a.score<b.score;
}
bool comp2(const frame &a, const frame &b){
return a.number < b.number;
}
int main() {
ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
int n,m,s,o=1;
cin >> n >> m;
vector<frame> f;
int student[101];
for(int i=0; i<101; i++) student[i] = 0;
for(int i=0; i<m; i++){
cin >> s;
student[s]++;
if(f.size()<n){
if(student[s]==1) f.push_back({s,o,1});
else{
for(int i=0; i<f.size(); i++){
if(f[i].number==s){
f[i].score++;
break;
}
}
}
}
else{
if(student[s]==1){
student[f[0].number] = 0;
f[0] = {s,o,1};
}
else{
for(int i=0; i<f.size(); i++){
if(f[i].number==s){
f[i].score++;
break;
}
}
}
}
o++;
sort(f.begin(),f.end(),comp1);
}
sort(f.begin(),f.end(),comp2);
for(int i=0; i<f.size(); i++) cout << f[i].number << " ";
cout << "\n";
return 0;
}
'🖥️ CS > Baekjoon Algorithms' 카테고리의 다른 글
백준 14395번 4연산 (C++) (0) | 2021.06.07 |
---|---|
백준 21758번 꿀 따기 (C++) (0) | 2021.06.07 |
백준 1963번 소수 경로 (C++) (0) | 2021.06.02 |
백준 19942번 다이어트 (C++) (0) | 2021.06.02 |
백준 6087번 레이저통신 (C++) (0) | 2021.06.01 |