
const fs = require('fs');
const path = process.platform === 'linux' ? '/dev/stdin' : 'Wiki\\input.txt';
const [kl, ...students] = fs.readFileSync(path).toString().trim().split('\n');
const [k, l] = kl.split(' ').map((it) => Number(it));
const studentsMap = new Map();
for (const targetStudent of students) {
if (studentsMap.has(targetStudent)) {
studentsMap.delete(targetStudent);
}
studentsMap.set(targetStudent);
}
let cnt = 0;
const answer = [];
studentsMap.forEach((_, key) => {
if (cnt < k) answer.push(key);
cnt++;
});
console.log(answer.join('\n'));
이 문제는 해시 문제 유형이다.
문제를 해결하는 로직 자체는 어렵지 않았다.
일반 객체는 삽입 순서를 기억하지 않는다. 따라서 일반 객체로 구현한다면 객체에 해당 학번이 없다면 키-벨류 추가 해당 학번이 있다면 벨류값 업데이트를 해준 뒤 다시 순서대로 정렬해 k 명만큼 잘라내야하므로 시간초과가 발생한다.
맵은 일반객체와 달리 삽입 순서를 기억하므로 입력으로 받는 학번의 개수만큼만 순회를 해주면 된다.
유용한 맵의 사용법을 잘 알아놓자.
Map.set()Map.has()Map.delete()Map.clear()Map.keys()Map.values()Map.entries()심지어 맵은 이터러블이다(ㄷㄷ) 따라서 for of 문으로 순회 가능