[백준] 12281. Sorting (Large)
문제 링크
풀이 과정
arr.forEach((v, i) => {
if (v % 2) isOdd[i] = true;
else isOdd[i] = false;
});
레이블(인덱스)에 알맞은 사람의 책을 진열해야 하므로, 책 번호가 짝수인지 홀수인지를 저장해 두었습니다.
for (let num of arr) {
if (num % 2) minHeap.push(num);
else maxHeap.push(num);
}
책의 숫자가 홀수면 Alex꺼, 짝수면 Bob꺼고, Alex는 오름차순으로, Bob 은 내림차순으로 정렬합니다.
- 책 번호를 2로 나눈 나머지가 0이 아니면 홀수를 의미하므로, Alex 의 책이 저장되어 있는 minHeap 에 해당 숫자를 저장합니다.
- 나머지가 0이면 짝수를 의미하므로, Bob 의 책이 저장되어 있는 maxHeap 에 해당 숫자를 저장합니다.
minHeap.sort((a, b) => a - b);
maxHeap.sort((a, b) => b - a);
for (let idx = 0; idx < N; idx++) {
if (isOdd[idx]) arr[idx] = minHeap.shift();
else arr[idx] = maxHeap.shift();
}
정렬 기준에 따라 정렬을 진행한 뒤, 맨 앞 요소를 꺼내는 shift 메소드
를 통해 책장을 진열합니다.
코드
const fs = require("fs");
const stdin = (process.platform === "linux"
? fs.readFileSync("/dev/stdin").toString()
: `2
5
5 2 4 3 1
7
-5 -12 87 2 88 20 11`
)
.trim()
.split("\n");
const input = (() => {
let line = 0;
return () => stdin[line++];
})();
const T = +input();
let answer = "";
for (let tc = 1; tc <= T; tc++) {
const N = +input();
const arr = input().split(" ").map(Number);
const isOdd = Array(N);
let minHeap = [],
maxHeap = [];
arr.forEach((v, i) => {
if (v % 2) isOdd[i] = true;
else isOdd[i] = false;
});
for (let num of arr) {
if (num % 2) minHeap.push(num);
else maxHeap.push(num);
}
minHeap.sort((a, b) => a - b);
maxHeap.sort((a, b) => b - a);
for (let idx = 0; idx < N; idx++) {
if (isOdd[idx]) arr[idx] = minHeap.shift();
else arr[idx] = maxHeap.shift();
}
answer = answer.concat("Case #" + tc + ": " + arr.join(" ") + "\n");
}
console.log(answer);
댓글남기기