문제링크: https://www.acmicpc.net/problem/1205
배열 정렬과 해쉬맵을 사용해서 푼 문제이다.
카테고리를 보니까 구현이라고 되어있더라.
해쉬맵 말고 배열의 index 를 사용할까 했는데, 최악의 경우 2,000,000,000 이 들어올 수 있으므로 불필요한 메모리를 사용할 것 같아 해쉬맵을 사용했다.
1. 테스트 케이스를 보면 N 이 0인 경우가 존재한다. 이 경우 때문에 삼항 연산자를 사용해 data 를 할당한다.
2. rank 배열에 값을 넣을 때 [점수, 0] 과 같은 데이터를 넣어주었다. 이렇게 배열 형식으로 넣어준 이유는 0이 기존에 있던 점수임을 나중에 사용하기 위함이다.
3. rank 를 만들면서 점수를 key 로 한 해쉬맵을 만들어 점수의 갯수를 카운트 해준다.
4. [태수의 점수 , 1] 로 rank 배열에 넣는다. 이때 해쉬맵도 갱신해야한다.
5. rank 배열을 첫번째 인덱스를 기준으로 내림차순, 동순위일 경우 두번째 인덱스를 기준으로 오름차순 정렬한다.
5-1. 오름차순 정렬한 이유는 문제에 같은 점수가 있을 때는 그러한 점수의 등수 중에 가장 작은 등수가 된다. 라는 조건 때문이다.
6. rank 배열을 탐색하여 taesuScore를 찾는다.
6-1. 순위가 P 보다 크다면 answer에 -1 을 할당한다.
6-2. 순위가 P 보다 작거나 같은 경우라면 순위 - (해쉬맵[태수점수] - 1) 을 한 값을 할당한다.
const fs = require('fs');
BOJkey = false;
const input = fs
.readFileSync(BOJkey ? './javascript/1205/input.txt' : './dev/stdin')
.toString()
.trim()
.split('\n')
.map(el => el.split(' ').map(Number));
let answer = 0;
const [N, taesuScore, P] = input.shift();
const data = input[0] === undefined ? [] : input.pop(); // 1
const duplicateMap = {};
const rank = data.map(el => {
duplicateMap[el] = duplicateMap[el] === undefined ? 1 : duplicateMap[el] + 1;
return [el, 0];
});
// 4
duplicateMap[taesuScore] = duplicateMap[taesuScore] === undefined ? 1 : duplicateMap[taesuScore] + 1;
rank.push([taesuScore, 1]);
// 5
rank.sort((a, b) => {
if (a[0] == b[0]) return a[1] - b[1];
return b[0] - a[0];
});
rank.forEach(([score,value], index) => {
if (score === taesuScore && value === 1) {
if (index + 1 > P) answer = -1;
else answer = index + 1 - (duplicateMap[taesuScore] - 1);
}
});
console.log(answer);
'공부기록 > 자바스크립트 코딩테스트' 카테고리의 다른 글
[바킹독 강의] 다익스트라 (0) | 2023.04.24 |
---|---|
[백준/Python] 3649 로봇 프로젝트 (2) | 2023.03.30 |
[백준/JS] 2529 부등호 (0) | 2023.03.29 |
[백준/JS] 1700 멀티탭 스케줄링 (4) | 2023.03.29 |
[백준/JS] 1946 신입사원 (3) | 2023.03.28 |