문제 조건 분석
- 입력: 첫째 줄에 점의 개수 N (1 ≤ N ≤ 100,000), 둘째 줄부터 N개의 줄에는 i번점의 위치 xi와 yi. (-100,000 ≤ xi, yi ≤ 100,000)
- 좌표는 항상 정수
- 위치가 같은 두 점은 없다.
- 출력: 첫째 줄부터 N개의 줄에 점을 정렬한 결과를 출력
설계
- 이차 배열로 입력값 받아오기
- 이후에 sort의 compareFn을 조건에 맞게 설계
다른 풀이
- sort 비교함수 간단하면 분리 없이 이렇게 작성해도 괜찮을 것 같다.
- arr.sort(function (a, b) { if (a.x - b.x == 0) { return a.y - b.y; } else { return a.x - b.x; } });
코드 개선
- forEach로 join하지 말고 sort 비교함수에서 구조 분해 할당으로 join 없이 효율적으로 개선하기
// 기존
//메인함수에서
const sortedSpots = spots
// 각 좌표를 여기에서 split 해줌
.map((spot) => spot.split(" "))
.sort((a, b) => compareFn(a, b));
//split한 걸 다시 이어붙여줌
sortedSpots.forEach((line) => answer.push(line.join(" ")));
return console.log(answer.join("\\n"));
//기존 비교함수에서
function compareFn(a, b) {
if (+a[0] === +b[0]) return +a[1] - +b[1];
return +a[0] - +b[0];
}
// 개선 후
//메인함수에서 그냥 좌표 그대로 넘겨주기
const sortedSpots = spots.sort(compareFn);
const answer = sortedSpots.join("\\n");
//비교함수에서 구조분해할당으로 정렬
const [aX, aY] = a.split(" ").map(Number);
const [bX, bY] = b.split(" ").map(Number);
if (aX === bX) {
return aY - bY;
}
return aX - bX;