[백준] 11650 좌표 정렬하기

morecodeplease·2024년 9월 4일
0

백준

목록 보기
5/5
post-thumbnail

🌭 문제 설명

  • 2차원 평면 위의 점 N개가 주어진다. 좌표를 x좌표가 증가하는 순으로, x좌표가 같으면 y좌표가 증가하는 순서로 정렬한 다음 출력하는 프로그램을 작성하시오.

🍗 제한 사항

  • 없음

🎁 입출력 예시


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

  • 첫째 줄부터 N개의 줄에 점을 정렬한 결과를 출력한다.


😎 나의 풀이

let fs = require('fs');
let input = fs.readFileSync('input.txt').toString().split('\n');

let n = Number(input[0]);
let arr = [];

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

function compare(a, b) {
  if (a[0] != b[0]) {
    return a[0] - b[0]; // x 좌표 기준 오름차순 정렬
  } else return a[1] - b[1]; // x가 같으면 y좌표 기준 오름차순 정렬
}
arr.sort(compare); // compare 함수로 정렬

let answer = '';
for (let sorted of arr) {
  answer += sorted[0] + ' ' + sorted[1] + '\n';
}
console.log(answer);
  1. n값을 숫자로 바꿔준다.
  2. for문으로 input을 순회해서 xy에 각각 할당시켜주고 arr에 푸시한다.
  3. compare 함수를 선언해서 sort를 명시적으로 정렬시켜주는데 x,y가 같지않고 xy보다 크면 x좌표 기준 오름차순 정렬을 하고, 같으면 y좌표 기준 오름차순 정렬을 한다.
  4. answer에 arr을 순회해서 출력문과 같이 출력한다.

🧵 다른 풀이

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

function sort(input) {
  input.shift();
  const output = input.map(s => s.split(' ').map(Number));
  output.sort((a, b) => a[0] - b[0] || a[1] - b[1]);
  return output.map(s => `${s[0]} ${s[1]}`).join('\n');
}

console.log(sort(input));
  1. sort라는 함수를 선언해서 input값이 들어오게 만든다.
  2. shiftn을 없애고 input을 순회하여 숫자로 만들어준다.
  3. (a, b) => a[0] - b[0] 첫 번째 원소(즉, x값)를 기준으로 오름차순 정렬하고 만약 a[0] - b[0]이 양수면 b가 앞에 오고, 음수면 a가 앞에 온다.
    || a[1] - b[1] 는 첫 번째 원소가 같다면, 두 번째 원소(즉, y값)를 기준으로 오름차순 한다. 이는 a[0] === b[0]일 때 적용된다.
  4. output.map(s => ${s[0]} ${s[1]}) 정렬된 배열을 다시 문자열로 변환하고
    배열의 요소들을 줄바꿈(\n)을 기준으로 하나의 문자열로 결합한다.

  • 처음에 이문제는 어떻게 풀지 감이 안잡혔는데 sort함수의 동작원리를 찾아보고 풀 수 있게 되었다.
profile
Everyday's a lesson

0개의 댓글