본문 바로가기

Study/Coding Test

[baekjoon] 좌표 정렬하기(JavaScript)

📘 오늘의 코딩테스트 - 좌표 정렬하기(JavaScript)

🔢 문제 번호: 11650

🔗 문제 링크: 백준 - 좌표 정렬하기

 

 

 

 

🧠 문제 요약

  • 2차원 평면 위의 점 N개가 주어진다
  • 좌표를 x좌표가 증가하는 순으로, x좌표가 같으면 y좌표가 증가하는 순서로 정렬한 다음 출력하는 문제
    • 입력: 첫째 줄에 점의 개수 N (1 ≤ N ≤ 100,000), 둘째 줄부터 N개의 줄에 각 점의 위치 xi와 yi
    • 출력: 정렬된 좌표를 한 줄에 하나씩 출력

 

 

 

✅ 실행 예시 및 결과

입력:
5
3 4
1 1
1 -1
2 2
3 3

출력:
1 -1
1 1
2 2
3 3
3 4

 

 

 

✍️ 내 풀이

  • input.slice(1)로 좌표 데이터만 분리
  • 빈 배열 coordinates를 생성하여 파싱된 좌표들을 저장
  • for문으로 각 줄을 순회하며 좌표 분리하고 coordiantespush
  • sort()로 정렬
  • forEach()와 join(' ')을 사용해서 각 좌표를 공백으로 구분하여 한 줄씩 출력

 

 

 

💻 내가 푼 코드

const input = require('fs').readFileSync('/dev/stdin').toString().trim().split('\n');

const N = parseInt(input[0]);
const inputLines = input.slice(1);
const coordinates = [];

for(let i = 0; i < N; i++) {
    const line = inputLines[i];
    const parts = line.split(' ');
    coordinates.push([parseInt(parts[0]), parseInt(parts[1])]);
}

coordinates.sort((a, b)=> {
    if (a[0] !== b[0]) {
        return a[0] - b[0];
    } else {
        return a[1] - b[1];
    }
});

coordinates.forEach((code) => {
    console.log(code.join(' '));
});

 

 

 

📎 남이 푼 코드

const [N, ...lines] = require('fs').readFileSync('/dev/stdin').toString().trim().split('\n');
const coordinates = lines.map(line => line.split(' ').map(Number));

coordinates.sort((a, b) => a[0] - b[0] || a[1] - b[1]);
console.log(coordinates.map(coord => coord.join(' ')).join('\n'));
  • const [N, ...lines]: 구조분해할당으로 첫 번째 요소는 N에, 나머지는 lines 배열에 한 번에 할당
  • map(Number): parseInt() 대신 Number 함수를 사용해 더 간결하게 숫자로 변환
  • a[0] - b[0] || a[1] - b[1]: 논리 OR 연산자로 다중 조건 정렬을 한 줄로 표현
  • coordinates.map().join('\n'): 전체 결과를 하나의 문자열로 만들어서 한 번에 출력
  • for문 없이 map() 체이닝으로 함수형 프로그래밍 스타일 구현

 

 

 

🔍 회고 & 배운 점

  • 2차원 배열 정렬에서 다중 조건 정렬은 헷갈린다
  • 나 같은 경우는 변수명을 정확히 해야 가독성이 높은 것 같은데 메모리를 많이 먹는 거 같다(시간도......후반에는 시간초과로 실패;;;;)
  • 점점 함수형으로도 시도해봐야겠다
  • 그래도 어제 나이순 정렬을 한번 해서 그런지 굳 ㅋㅋ
반응형