📌 문제
올림픽은 참가에 의의가 있기에 공식적으로는 국가간 순위를 정하지 않는다. 그러나, 많은 사람들이 자신의 국가가 얼마나 잘 하는지에 관심이 많기 때문에 비공식적으로는 국가간 순위를 정하고 있다. 두 나라가 각각 얻은 금, 은, 동메달 수가 주어지면, 보통 다음 규칙을 따라 어느 나라가 더 잘했는지 결정한다.
- 금메달 수가 더 많은 나라
- 금메달 수가 같으면, 은메달 수가 더 많은 나라
- 금, 은메달 수가 모두 같으면, 동메달 수가 더 많은 나라
각 국가는 1부터 N 사이의 정수로 표현된다. 한 국가의 등수는 (자신보다 더 잘한 나라 수) + 1로 정의된다. 만약 두 나라가 금, 은, 동메달 수가 모두 같다면 두 나라의 등수는 같다. 예를 들어, 1번 국가가 금메달 1개, 은메달 1개를 얻었고, 2번 국가와 3번 국가가 모두 은메달 1개를 얻었으며, 4번 국가는 메달을 얻지 못하였다면, 1번 국가가 1등, 2번 국가와 3번 국가가 공동 2등, 4번 국가가 4등이 된다. 이 경우 3등은 없다.
각 국가의 금, 은, 동메달 정보를 입력받아서, 어느 국가가 몇 등을 했는지 알려주는 프로그램을 작성하시오.
📌 입력
입력의 첫 줄은 국가의 수 N(1 ≤ N ≤ 1,000)과 등수를 알고 싶은 국가 K(1 ≤ K ≤ N)가 빈칸을 사이에 두고 주어진다. 각 국가는 1부터 N 사이의 정수로 표현된다. 이후 N개의 각 줄에는 차례대로 각 국가를 나타내는 정수와 이 국가가 얻은 금, 은, 동메달의 수가 빈칸을 사이에 두고 주어진다. 전체 메달 수의 총합은 1,000,000 이하이다.
📌 출력
출력은 단 한 줄이며, 입력받은 국가 K의 등수를 하나의 정수로 출력한다. 등수는 반드시 문제에서 정의된 방식을 따라야 한다.
📌 예제 입출력
📌 풀이
구할 것
- input의 첫 줄인 나라 수와 타겟을 제외한다.
- 나머지 input을 for... of 문으로 반복하며 돌되 국가를 표현하는 정수를 idx로 선언하고, 나머지를 금/은/동 메달을 뜻하는 gold, silver, bronze로 할당한다. 선언한 빈 객체 countries에 밸류값을 설정할 때는 해당 키(idx)에 해야 하므로 괄호 표기법으로 접근한다. { '1': [1, 2, 0], '2': [0, 1, 0] ... } 이런 식으로 설정되어 있다.
- 순위를 정하기 위해 변수 rank를 1로 초기화 한다.
- 1번 국가부터 num번째 국가까지 for문으로 순회하되 만약 i가 타겟 국가라면 비교를 건너 뛴다.
- 그렇지 않다면 countries 객체에서 타겟의 값과 비교할 i 의 값을 가져온다.
- 이 때 금메달을 먼저 비교하고 동점이면 은메달을 비교, 은메달도 동점이면 동메달을 비교해야 한다. 따라서 조건문 안에 크게 조건을 3개 넣고, 타겟 국가의 금/은/동메달보다 비교 국가의 금/은/동메달이 더 많을 경우에는 rank를 올려준다.
- 만약 타겟 국가의 금메달이 비교 국가의 금메달보다 많다면 || 이후는 볼 필요가 없어 바로 rank를 출력하면 되는 것이다.
const fs = require("fs");
const filePath = process.platform === "linux" ? "/dev/stdin" : "input.txt";
let input = fs.readFileSync(filePath).toString().trim().split("\n");
const [num, target] = input.shift().split(" ").map(Number);
let countries = {};
for (let country of input) {
const [idx, gold, silver, bronze] = country.split(" ").map(Number);
countries[idx] = [gold, silver, bronze];
}
let rank = 1;
for (let i = 1; i <= num; i++) {
if (i === target) {
continue;
}
const [g1, s1, b1] = countries[target];
const [g2, s2, b2] = countries[i];
if (
g1 < g2 ||
(g1 === g2 && s1 < s2) ||
(g1 === g2 && s1 === s2 && b1 < b2)
) {
rank++;
}
}
console.log(rank);
일단 문제를 제대로 읽지 않아서 한참 헤맸고 문제를 읽고 나서는 배열로 잘못 접근해 인덱스 부분이 빠꾸가 났다.
객체로 접근하는 게 제일 빠르고 간결한 것 같다. 객체를 쓰는 건 힌트를 받았는데 왜 이걸 쓸 생각을 못 했을까... 🥲
'⚙️ 코딩테스트' 카테고리의 다른 글
[JavaScript] 백준 코딩테스트 1158. 실버 4 : 요세푸스 문제 (0) | 2023.07.31 |
---|---|
[JavaScript] 백준 코딩테스트 10866. 실버 4 : 덱 (0) | 2023.07.31 |
[JavaScript] 백준 코딩테스트 25206. 실버 5 : 너의 평점은 (0) | 2023.07.27 |
[JavaScript] 백준 코딩테스트 1157. 브론즈 1 : 단어 공부 (0) | 2023.07.26 |
[JavaScript] 백준 코딩테스트 7568. 실버 5 : 덩치 (0) | 2023.07.25 |