ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 2751. 수 정렬하기 2
    Baekjoon 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());

    'Baekjoon' 카테고리의 다른 글

    10808. 알파벳 개수  (0) 2023.05.07
    1935. 후위 표기식2  (0) 2023.05.07
    11655. ROT13  (0) 2023.05.02
    10845. 큐  (0) 2023.05.02
    10820. 문자열 분석  (0) 2023.05.02
Designed by Tistory.