2751. 수 정렬하기 2
문제
N개의 수가 주어졌을 때, 이를 오름차순으로 정렬하는 프로그램을 작성하시오.
입력
첫째 줄에 수의 개수 N(1 ≤ N ≤ 1,000,000)이 주어진다. 둘째 줄부터 N개의 줄에는 수가 주어진다. 이 수는 절댓값이 1,000,000보다 작거나 같은 정수이다. 수는 중복되지 않는다.
5
5
4
3
2
1
출력
첫째 줄부터 N개의 줄에 오름차순으로 정렬한 결과를 한 줄에 하나씩 출력한다.
1
2
3
4
5
에러
let fs = require("fs");
const readFileSyncAdd = "/dev/stdin";
const input = fs.readFileSync(readFileSyncAdd).toString().trim().split('\n');
const len = input.shift();
console.log(input.sort().join('\n').trim());
처음에 문제 보고 '어? 너무 쉬운데?' 싶었다.
그래서 진짜 30초만에 작성하고 제출했는데... 그 결과는 틀렸습니다.
왜였을까? 겉으로 보기엔 전혀 문제가 없는 코드였는데.
그 이유는 sort() 함수에 있다.
sort()는 기본적으로 유니코드 값으로 정렬하기 때문에 문자열이나 한 자리 수의 숫자들에서는 문제가 없다.
그러나 두 자리 수 이상의 숫자가 포함된 경우 문제가 생기는 것.
숫자를 정렬하려면 compareFunction 개념을 알아야한다.
compareFunction 이란 sort() 함수의 매개변수이다.
compareFunction(a,b) 이 0보다 작을 경우, a가 앞으로 오도록 정렬.
0보다 클 경우, b가 앞으로 오도록 정렬.
0을 반환할 경우, 그대로 정렬한다.
num = [ 4, 200, 100];
num.sort(function(a,b) {
return a - b;
});
위 코드를 예시로 들겠다.
a, b에 각각 200, 4가 대입된다. (순서대로 대입되지 않는 것이 좀 헷갈릴 수 있다.)
200 - 4 가 반환되므로 0보다 큰 값이 반환되었다. 즉, b(4) 가 앞으로 오도록 정렬된다.
그 후 100, 200이 대입되면 100 - 200 이 반환되므로 0보다 작은 값이 반환된다.
즉, a(100) 가 앞으로 오도록 정렬된다.
그래서 [ 4, 100, 200 ] 으로 정렬되는 것이다.
즉, 반환값이 a - b 라면 오름차순, b - a 라면 내림차순으로 정렬할 수 있다는 것.
이 개념을 반영한 코드를 추가해준다.
최종 코드는 아래와 같다.
코드
let fs = require("fs");
const readFileSyncAdd = "./2751/2751.txt";
const input = fs.readFileSync(readFileSyncAdd).toString().trim().split('\n');
//가장 첫 숫자는 입력될 숫자의 개수이다.
const len = input.shift();
console.log(input.sort((a,b)=>a-b).join('\n').trim());