문제링크: https://www.acmicpc.net/problem/1205
1205번: 등수 구하기
첫째 줄에 N, 태수의 새로운 점수, 그리고 P가 주어진다. P는 10보다 크거나 같고, 50보다 작거나 같은 정수, N은 0보다 크거나 같고, P보다 작거나 같은 정수이다. 그리고 모든 점수는 2,000,000,000보
www.acmicpc.net
배열 정렬과 해쉬맵을 사용해서 푼 문제이다.
카테고리를 보니까 구현이라고 되어있더라.
해쉬맵 말고 배열의 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 |