하루 알고리즘(JS)

[바미] 좌표 정렬하기 2

Bami 2024. 4. 28. 09:23
728x90
반응형

문제

https://www.acmicpc.net/problem/11651

 

11651번: 좌표 정렬하기 2

첫째 줄에 점의 개수 N (1 ≤ N ≤ 100,000)이 주어진다. 둘째 줄부터 N개의 줄에는 i번점의 위치 xi와 yi가 주어진다. (-100,000 ≤ xi, yi ≤ 100,000) 좌표는 항상 정수이고, 위치가 같은 두 점은 없다.

www.acmicpc.net

코드

const fs = require('fs');
const input = fs.readFileSync('/dev/stdin').toString().trim().split('\n');
const N = parseInt(input[0], 10);
const points = [];

for (let i = 1; i <= N; i++) {
    const [x, y] = input[i].split(' ').map(Number);
    points.push({x, y});
}

// 정렬: y좌표에 따라 오름차순 정렬하고, y좌표가 같다면 x좌표로 정렬
points.sort((a, b) => {
    if (a.y === b.y) {
        return a.x - b.x;  // y좌표가 같을 경우 x좌표로 정렬
    }
    return a.y - b.y;    // y좌표로 정렬
});

// 결과 출력
let result = '';
points.forEach(point => {
    result += `${point.x} ${point.y}\n`;
});

console.log(result.trim());

코드 설명

데이터를 입력 받은 후 points.sort((a, b) => {...}) 부분에서 각 점의 좌표를 객체 형태로 저장된 points데이터를 sort() 메서드와 비교 함수를 사용하여 정렬을 해줍니다.

 

그 후 정렬 기준에 맞춰 각 점을 정렬해 주는데 정렬 규칙은 아래와 같습니다.

  • y좌표가 동일하지 않은 경우 -모든 점들을 먼저 y좌표에 따라 오름차순으로 정렬.
  • y좌표가 동일한 경우 - x좌표에 따라 오름차순으로 정렬.

그 이후 정렬이 완료되면 forEach 루프를 사용하여 정렬된 각 점의 좌표를 문자열 형태로 result에 추가 후 trim()으로 출력 해줍니다.

문제 해설

이 문제는 어떻게 2차원 평면에 있는 점들을 특정 순서대로 정렬해 줄 것인가?가 관건입니다.

자세한 문제 설명은 코드 설명에 적혀 있으므로 코드 설명부분을 참고하시면 될 거 같습니다.

이와 같은 코드 패턴은  2차원 평면상의 데이터를 다룰 때 자주 사용되는 방식입니다.

 

시간 복잡도 

sort() 함수를 사용했기 때문에 평균적으로 O(N log N)의 시간 복잡도를 가지게 됩니다.

여기서 N은 정렬해야 할 데이터의 개수를 의미하고, log N은 데이터를 분할하며 정렬하는 과정에서 발생하는 비교 횟수를 의미합니다.

공간 복잡도

이 문제에서는 점들의 좌표를 객체 배열로 관리하므로, 입력된 점의 개수 N에 비례하는 공간이 필요하고, 최종 결과를 출력하기 위해 생성되는 문자열 역시 N개의 정보를 모두 포함해야 하므로 0(N)의 공간을 차지하게됩니다.

 

 

728x90
반응형