Baekjoon

2751. 수 정렬하기 2

기 도 2023. 5. 7. 18:15

 문제 

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());