N
개가 주어진다. 좌표를 x
좌표가 증가하는 순으로, x
좌표가 같으면 y
좌표가 증가하는 순서로 정렬한 다음 출력하는 프로그램을 작성하시오.
첫째 줄에 점의 개수 N (1 ≤ N ≤ 100,000)
이 주어진다.
둘째 줄부터 N
개의 줄에는 i
번점의 위치 xi
와 yi
가 주어진다. (-100,000 ≤ xi, yi ≤ 100,000)
좌표는 항상 정수이고, 위치가 같은 두 점은 없다.
첫째 줄부터 N
개의 줄에 점을 정렬한 결과를 출력한다.
let fs = require('fs');
let input = fs.readFileSync('input.txt').toString().split('\n');
let n = Number(input[0]);
let arr = [];
for (let i = 1; i <= n; i++) {
let [x, y] = input[i].split(' ').map(Number);
arr.push([x, y]);
}
function compare(a, b) {
if (a[0] != b[0]) {
return a[0] - b[0]; // x 좌표 기준 오름차순 정렬
} else return a[1] - b[1]; // x가 같으면 y좌표 기준 오름차순 정렬
}
arr.sort(compare); // compare 함수로 정렬
let answer = '';
for (let sorted of arr) {
answer += sorted[0] + ' ' + sorted[1] + '\n';
}
console.log(answer);
n
값을 숫자로 바꿔준다.input
을 순회해서 x
와 y
에 각각 할당시켜주고 arr
에 푸시한다.compare
함수를 선언해서 sort
를 명시적으로 정렬시켜주는데 x,y
가 같지않고 x
가 y
보다 크면 x
좌표 기준 오름차순 정렬을 하고, 같으면 y
좌표 기준 오름차순 정렬을 한다.answer
에 arr을 순회해서 출력문과 같이 출력한다.const input = require('fs').readFileSync('/dev/stdin', 'utf8').trim().split('\n');
function sort(input) {
input.shift();
const output = input.map(s => s.split(' ').map(Number));
output.sort((a, b) => a[0] - b[0] || a[1] - b[1]);
return output.map(s => `${s[0]} ${s[1]}`).join('\n');
}
console.log(sort(input));
sort
라는 함수를 선언해서 input
값이 들어오게 만든다.shift
로 n
을 없애고 input을 순회하여 숫자로 만들어준다.(a, b) => a[0] - b[0]
첫 번째 원소(즉, x값)를 기준으로 오름차순 정렬하고 만약 a[0] - b[0]
이 양수면 b
가 앞에 오고, 음수면 a
가 앞에 온다.|| a[1] - b[1]
는 첫 번째 원소가 같다면, 두 번째 원소(즉, y값)를 기준으로 오름차순 한다. 이는 a[0] === b[0]
일 때 적용된다.output.map(s => ${s[0]} ${s[1]})
정렬된 배열을 다시 문자열로 변환하고
- 처음에 이문제는 어떻게 풀지 감이 안잡혔는데
sort
함수의 동작원리를 찾아보고 풀 수 있게 되었다.