자연수 k와 길이가 같은 배열 A,B를 입력 받을 때
입력받은 배열의 순열 중 같은 인덱스의 합이 항상 k보다 큰 조합이 있는가?
문제 이해부터 어려워서 sample을 여러 차례 정독했다.
가장 핵심은 항상 k보다 큰 이었다. 앞에서 큰 수를 다 뽑아버리면 남은 요소들은 작은 수끼리의 합일 수 밖에 없다. 따라서 조건을 만족시키기 위해서는 전체적으로 최소값을 최대화하여야 하고, 이를 구현하기 위해선 A에서 가장 큰 수 + B에서 가장 작은 수 / A에서 두번째로 큰 수 + B에서 두번째로 작은 수 ... 식으로 매칭시켜야 한다.
따라서 sort 메서드를 통해 하나는 내림차순, 하나는 오름차순으로 정렬한 다음 for문으로 같은 인덱스끼리 더해줘 하나라도 k보다 작으면 NO를 리턴시킨다.
'use strict';
const fs = require('fs');
process.stdin.resume();
process.stdin.setEncoding('utf-8');
let inputString = '';
let currentLine = 0;
process.stdin.on('data', function(inputStdin) {
inputString += inputStdin;
});
process.stdin.on('end', function() {
inputString = inputString.split('\n');
main();
});
function readLine() {
return inputString[currentLine++];
}
/*
* Complete the 'twoArrays' function below.
*
* The function is expected to return a STRING.
* The function accepts following parameters:
* 1. INTEGER k
* 2. INTEGER_ARRAY A
* 3. INTEGER_ARRAY B
*/
function twoArrays(k, A, B) {
A.sort((a, b) => a - b);
B.sort((a, b) => b - a);
for(let i = 0; i < A.length; i++) {
if (A[i] + B[i] < k) {
return "NO";
}
}
return "YES";
}
function main() {
const ws = fs.createWriteStream(process.env.OUTPUT_PATH);
const q = parseInt(readLine().trim(), 10);
for (let qItr = 0; qItr < q; qItr++) {
const firstMultipleInput = readLine().replace(/\s+$/g, '').split(' ');
const n = parseInt(firstMultipleInput[0], 10);
const k = parseInt(firstMultipleInput[1], 10);
const A = readLine().replace(/\s+$/g, '').split(' ').map(ATemp => parseInt(ATemp, 10));
const B = readLine().replace(/\s+$/g, '').split(' ').map(BTemp => parseInt(BTemp, 10));
const result = twoArrays(k, A, B);
ws.write(result + '\n');
}
ws.end();
}
오름차순(ASC,Ascending) -> sort((a,b) => a-b)
내림차순(DESC, Descending) -> sort((a,b) => b-a)