알고리즘

[백준] 11650 좌표 정렬하기

jimyu 2024. 8. 2. 00:32

문제 조건 분석

  • 입력: 첫째 줄에 점의 개수 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;