Algorithm/Baekjoon(Node.js)

[JavaSrcipt] Baekjoon - 11650 : 좌표 정렬하기 (map(map), sort(if))

비망노트 2021. 10. 24. 21:26

문제

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

입력

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

출력

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

 

예제입력 예제출력
5
3 4
1 1
1 -1
2 2
3 3
1 -1
1 1
2 2
3 3
3 4

 

❌ 풀이

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

for(let i=0;i<n-1;i++){
    for(let j=0;j<n-i-1;j++){
        
        let [x,y]=arr[j].split(' ').map(x=>Number(x));
        let [x2,y2]=arr[j+1].split(' ').map(x=>Number(x));
        
        if(x>x2){
            let temp=arr[j];
            arr[j]=arr[j+1];
            arr[j+1]=temp;
        }else if(x==x2){
            if(y>y2){
            let temp=arr[j];
            arr[j]=arr[j+1];
            arr[j+1]=temp;
            }
        }
    }
}
console.log(arr);

간단하게 각 인자의 x값 y값을 받아 버블정렬로 정렬했으나 시간초과.

 

✅ 다른분의 풀이

const fs = require('fs');
const input = fs.readFileSync('/dev/stdin').toString().trim().split('\n');
const N = input.shift();
// input = ['3 4', '1 1', '1 -1', '2 2', '3 3']

const coordsArr = input.map(coords =>
  coords.split(' ').map(nums => parseInt(nums))
);
// coordsArr = [ [ 3, 4 ], [ 1, 1 ], [ 1, -1 ], [ 2, 2 ], [ 3, 3 ] ]

let results = '';
coordsArr
  .sort((a, b) => {
    if (a[0] !== b[0]) {
      return a[0] - b[0];
    }else{
      return a[1] - b[1];
    }
  })
  .forEach(coords => {
    results += `${coords[0]} ${coords[1]}\n`;
  });

console.log(results);

 

❗ 반복문에 넣지않고 배열형태입력값 다시 배열로만들기
const coordsArr = input.map(coords =>
  coords.split(' ').map(nums => parseInt(nums))
);

❗ 항상 input이 처음에 split('\n')을 했기때문에 

반복문에 넣지않고 input.split().map ~~ 로 작성하면

항상 not a function 이라고 에러가 떴는데 이렇게 하면 에러없이

이중배열로 나누어진다.

 

✅ 이후 sort함수를 사용하는데

일반배열이었으면 [  ] 이므로 각 인자하나씩 a b로 받았겠지만

이중배열이므로 [ [ ] [ ] ]  여기선 [3,4] [1,1] 을 받아서

a[0]과 b[0]을 비교할 수 있게된다.

즉 각인자의 [0]값이 같지않다면 평소에 sort를 사용하듯이

return a -b   ->   return a[0] -b[0]으로하고

else 즉 같다면 a[1] -b[1]을 실행한다.

 

forEach

forEach() 메서드는 주어진 함수를 배열 요소 각각에 대해 실행합니다.

const array1 = ['a', 'b', 'c'];

array1.forEach(element => console.log(element));

// expected output: "a"
// expected output: "b"
// expected output: "c"

coordsArr에 있는 인자들을

results에 coords[0] coords[1]을 각각 다 넣는다.

 

이후 results를 한번만 출력함으로써 시간초과를 해결할 수 있다.

 

 

 

 

-출처

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