정렬. 7단계
11650번. 좌표 정렬하기
const fs = require("fs");
let input = fs.readFileSync("/dev/stdin").toString().trim().split("\n");
const iter = Number(input.shift());
let arr = [];
// 2차원 배열 생성하기
for(let i = 0; i < iter; i++){
// input[i]를 하나의 배열로 만든 뒤, arr 배열에 push.
arr.push(input[i].split(" ").map((item) => Number(item)));
}
// 2차원 배열에서의 오름차순 정렬 구현
// 기존 1차원 배열에서 쓰던 것에 []를 붙여서 사용한다고 생각하면 이해가 매우 쉽다.
arr.sort((a, b) => {
// arr[0][0]과 arr[1][0], arr[1][0]과 arr[2][0]...이런 식으로 생각하면 된다.
if (a[0] === b[0]) {
// 여기서는 arr[0][1]과 arr[1][1]...이렇게 될 것이다.
return a[1] - b[1]
} else {
return a[0] - b[0]
}
});
let ans = [];
for(let i = 0; i < iter; i++){
let answer = arr[i].join(" ");
ans.push(answer);
}
console.log(ans.join("\n"));
예시를 들어보자. 2차원 배열은 직접 손으로 그려보는게 이해가 빠르다.
입력 데이터
5
3 4
1 1
1 -1
2 2
3 3
가장 첫 번째로 나오는 숫자, 5는 shift로 빼내서 반복문에 사용(iter)
2차원 배열을 만드는 for문을 거치면서 데이터는 아래와 같이 변화한다.
3 4 -> [3, 4]
1 1 -> [1 ,1]
...
결과적으로 2차원 배열 arr은 아래와 같이 만들어진다.
[[3, 4],[1, 1],[1, -1],[2, 2],[3, 3]]
2차원 배열의 오름차순 정렬은 다음과 같이 동작한다.
sort((a,b) => a[0] - b[0])
이 것은 다음과 같은 의미이다.
arr[0][0]과 arr[1][0], 즉, 3과 1을 비교한다.
이런 식으로 정렬이 되어간다. 1차원 배열에서 사용한 것과 다를게 전혀 없다.
만약 arr[0][0], arr[1][0]이 같으면
a[1] - b[1]을 return한다. 다음과 같은 의미를 가진다.
arr[0][1]과 arr[1][1], 즉, 4와 1을 비교한다.
이제 정렬한 배열을 join을 사용하여 문자열로 만들 것이다.
arr[0].join(" ")은 [3, 4].join(" ")을 의미한다.
따라서, "3 4"가 된다. 다른 arr[i]들도 이렇게 변환되어 ans 배열에 push된다.
그 결과, ans 배열은 다음과 같다.
["3 4", "1 1", "1 -1", "2 2", "3 3"]
여기에 또 다시 join("\n")을 하면
"3 4"
"1 1"
"1 -1"
"2 2"
"3 3"
이 된다.
이를 그대로 console.log로 출력한다.
필자는 주로 for문으로 console.log를 찍어왔는데,
문제를 풀면 풀수록 시간 초과로 인해서 join으로 한번에 출력해야할 때가 많아졌다.
만약 시간 초과가 걸린다면, 우선적으로 console.log를 한번만 사용해서 모든 값을 출력하는 방법을 고려해보는 것이 좋을 것 같다.