[백준]1713_후보 추천하기

🐈 JAELEE 🐈·2021년 9월 4일

https://www.acmicpc.net/problem/1713

Solved

✔ 학생별 추천받은 횟수를 저장하는 배열과, 사진이 걸린 학생의 번호와 그 사진이 받은 추천수를 값을 저장하는 배열을 선언한다.
✔ 단순 구현 문제

using namespace std;
#include <iostream>
#include <vector>

int students[101]; //학생별 추천받은 횟수
vector<pair<int, int>> v; //사진틀(추천받은 학생 번호, 언제 게시되었는지)
bool ans[101]; //정답 정렬용 배열

int main() {
	int n, num_cc;
	int x;
	cin >> n >> num_cc;
	for (int i = 0; i < num_cc; i++) {
		cin >> x;
        //x는 이미 사진 틀에 있는 사진인 경우
		if (inRange(x)) students[x]++;
        //사진틀에 없고, 사진틀이 꽉 찬 경우
		else if (v.size() >= n) {
			delStudent();
			students[x]++;
			v.push_back(make_pair(x, i));
		}
        //사진틀에 없고, 사진틀이 덜 찬 경우
		else {
			students[x]++;
			v.push_back(make_pair(x, i));
		}
	}
	for (int i = 0; i < v.size(); i++)
		ans[v[i].first] = true;
	for (int i = 1; i <= 100; i++)
		if (ans[i]) cout << i << ' ';
	cout << '\n';
}
void delStudent() {
	int min_idx = 0;
	int min_student = 0, min_recNum = 0x3f3f3f3f;
	for (int i = 0; i < v.size(); i++) {
		if (min_recNum > students[v[i].first]) {
			min_idx = i;
			min_recNum = students[v[i].first];
		}
		else if (min_recNum == students[v[i].first]) {
			if (v[i].second < v[min_idx].second)
				min_idx = i;
		}
	}
	students[v[min_idx].first] = 0;
	v.erase(v.begin() + min_idx);
	
	return;
}
bool inRange(int x){
	for (int i = 0; i < v.size(); i++)
		if (v[i].first == x) return true;
	return false;
}

후기

- c++ vector도 js의 배열처럼 includes가 있다면 inRange()라는 함수가 불필요할텐데. inRange()대신 includes라는 이름이 더 직관적일 것 같다.

0개의 댓글