요약
- 주어진 숫자 카드 중에서 가장 개수가 많은 카드를 출력하라.
- 최대 개수가 동일한 카드가 여러 개라면 카드 번호가 더 작은 카드를 출력.
풀이
내 풀이
const readline = require("readline");
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout,
});
let input = [];
rl.on("line", function (line) {
input.push(line);
}).on("close", function () {
const [N, ...cards] = input.map(BigInt);
cards.sort((a, b) => (a < b ? -1 : a > b ? 1 : 0));
let count = 1,
maxCnt = 0,
maxVal = BigInt(cards[0]),
nextCard = undefined;
cards.forEach((card, index) => {
nextCard = cards[index + 1];
if (card == nextCard) {
count++;
} else {
count = 1;
}
if (count > maxCnt) {
maxCnt = count;
maxVal = card;
}
});
console.log(maxVal.toString());
process.exit();
});
추가로 활용한 예제
1
1
5
-5
-5
-2
-12
-2
또는 매우 큰 수를 직접 넣어 테스트해봤다.
요점
- BigInt
- 문제에서 주어진 숫자 카드에 적힌 숫자가 +- 2^62 를 넘어서는 수준이므로 반드시 BigInt 자료형을 사용해야 한다.
- BigInt를 사용했으므로 결과값 출력시에는 string형태로 변환해서 출력해야 한다.
- BigInt의 sort
- Array.prototype.sort() 자바스크립트의 내장 sort는 유니코드 기반 문자열 정렬이므로 숫자 정렬시에는 비교 함수를 인자로 전달해야 한다.
- 여기서 중요! BigInt 자료형의 sort를 정의할 때 return (a-b)의 경우는 반환값이 정수가 되어 오류가 난다. BigInt로 반환하기 위해서는 아래처럼 부등호를 통해 bool 연산값을 알고 -1, 0, 1 중 하나를 반환시켜야 한다.
cards.sort((a, b) => (a < b ? -1 : a > b ? 1 : 0));
링크 StackOverflow
주절주절
- 풀다 보니 오기가 생겨서 오전 내내 붙들고 ... 거의 20번 제출한 것 같다...!! 문제 풀이 과정에서 코드에 오류가 있는 것 같아서 계속 들여다봤고, 그래서 여러 번 고쳐보며 분명 배운 건 많은 느낌이다. for문으로도 해봤고, forEach로도 해보고, sort도 이것저것 만져보고, count도 여러 번 봤다.
- 그런데 틀린 이유가 readline 이었다니, 왜 진작에 시도해보지 않았을까 싶다. 꼭 겪어 봐야지 진심으로 깨닫더라. 다음에는 절대 같은 실수 하지 않기!!!
열심히...삽질했다...삽질...
그래도 풀어서 뿌듯!
'알고리즘' 카테고리의 다른 글
| [boj] 10825. 국영수 (node.js) (0) | 2022.01.25 |
|---|