월드초등학교 학생회장 후보는 일정 기간 동안 전체 학생의 추천에 의하여 정해진 수만큼 선정된다. 그래서 학교 홈페이지에 추천받은 학생의 사진을 게시할 수 있는 사진틀을 후보의 수만큼 만들었다. 추천받은 학생의 사진을 사진틀에 게시하고 추천받은 횟수를 표시하는 규칙은 다음과 같다.
후보의 수 즉, 사진틀의 개수와 전체 학생의 추천 결과가 추천받은 순서대로 주어졌을 때, 최종 후보가 누구인지 결정하는 프로그램을 작성하시오.
첫째 줄에는 사진틀의 개수 N이 주어진다. (1 ≤ N ≤ 20) 둘째 줄에는 전체 학생의 총 추천 횟수가 주어지고, 셋째 줄에는 추천받은 학생을 나타내는 번호가 빈 칸을 사이에 두고 추천받은 순서대로 주어진다. 총 추천 횟수는 1,000번 이하이며 학생을 나타내는 번호는 1부터 100까지의 자연수이다.
사진틀에 사진이 게재된 최종 후보의 학생 번호를 증가하는 순서대로 출력한다.
-> 예제는 맞았는데 실제 테스트에서 틀렸다.
const input = require('fs').readFileSync('ex.txt').toString().trim().split('\n');
let [N, M, list] = input; // 사진틀 개수, 추천 횟수, 추천 리스트
let arr = list.split(' ');
let obj = {};
arr.map((el) => (obj[el + '+'] = (obj[el + '+'] || 0) + 1)); // 객체에 반복 횟수 넣기
let sort = Object.entries(obj).sort(([, a], [, b]) => a - b); // 반복 횟수 기준으로 오름차순 정렬
let answer = [];
let s = sort.slice(-N);
let temp = [];
let i = N - 1;
while (i >= 0) {
if (s[i][1] !== s[i - 1][1]) {
answer.push(s[i][0]);
} else {
while (i > 0 && s[i][1] === s[i - 1][1]) {
temp.push(s[i][0]);
i--;
}
temp.push(s[i][0]);
answer.push(...temp.reverse());
}
i--;
}
let result = answer.map((el) => +el[0]).join(' ');
console.log(result);
const fs = require('fs');
const stdin = (
process.platform === 'linux'
? fs.readFileSync('/dev/stdin')
: `3
14
2 1 4 3 5 6 2 7 2 100 100 54 54 50`
)
.toString()
.trim()
.split('\n');
const input = (() => {
let line = 0;
return () => stdin[line++];
})();
const N = +input();
const K = +input();
const arr = input().split(' ').map(Number);
const candidates = new Map();
for (let i = 0; i < K; i++) {
let num = arr[i];
if (candidates.has(num)) {
candidates.get(num)[0]++; // 이미 있으면 count 증가
} else {
if (candidates.size === N) {
let min = null;
for ([key, value] of candidates.entries()) {
if (!min) {
min = [key, value];
continue;
}
const [minCnt, minTime] = min[1];
const [nowCnt, nowTime] = value;
if (nowCnt < minCnt || (nowCnt === minCnt && nowTime < minTime)) {
min = [key, value];
}
}
candidates.delete(min[0]);
}
candidates.set(num, [1, i]); // 사이즈가 N보다 작으면 바로 채워넣기
}
}
let answer = '';
[...candidates.keys()].sort((a, b) => a - b).forEach((candidate) => (answer += candidate + ' '));
console.log(answer);
https://ddb8036631.github.io/boj/1713_%ED%9B%84%EB%B3%B4-%EC%B6%94%EC%B2%9C%ED%95%98%EA%B8%B0/