문제
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
'Algorithm > Baekjoon(Node.js)' 카테고리의 다른 글
| [JavaSrcipt] Baekjoon - 1181 : 단어 정렬 (localeCompare) (0) | 2021.10.26 |
|---|---|
| [JavaSrcipt] Baekjoon - 11651 : 좌표 정렬하기 2 (0) | 2021.10.25 |
| [JavaSrcipt] Baekjoon - 1427 : 소트인사이드 (0) | 2021.10.23 |
| [JavaSrcipt] for...of (반복가능객체) (0) | 2021.10.22 |
| [JavaSrcipt] Baekjoon - 2108 : 통계학 (객체초기자 {}) (0) | 2021.10.22 |