[백준13414_자바스크립트(javascript)] - 수강신청

경이·2024년 5월 30일

𝑩𝑶𝑱 (𝒋𝒔)

목록 보기
45/325

🔴 문제

수강신청


🟡 Sol

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 문으로 순회 가능


🔵 Ref

profile
록타르오가르

0개의 댓글