[백준] 1431. 시리얼 번호

1 분 소요

문제 링크

[백준] 1431. 시리얼 번호


풀이 과정

정렬 문제입니다.


arr.sort((a, b) => {
    if (a.length != b.length) return a.length - b.length;
    let sum1 = sum(a),
        sum2 = sum(b);
    if (sum1 == sum2) return a.localeCompare(b);
    return sum1 - sum2;
});

위 코드는 문제 규칙에 따른 정렬 기준을 나타냅니다.

  1. 두 문자열 a, b 의 길이가 다르다면, 짧은게 먼저 온다.
  2. 둘의 길이가 같다면, 문자열 a의 모든 숫자의 합과 b의 모든 숫자의 합을 비교해, 작은 합을 가지는 게 먼저 온다.
  3. 합까지 같다면, 사전순으로 비교한다.

위 코드에 문자열의 사전순 비교를 도와주는 String.localCompare 메소드 를 사용했습니다.


function sum(str) {
    return str.match(/[\d]/g)?.reduce((sum, cur) => sum + +cur, 0) || 0;
}

함수 sum 은 파라미터로 받은 문자열 str 에서 숫자인 부분을 모두 매칭해 합을 더해 리턴합니다.

  • match 메소드를 통해 매칭되는 모든 문자열을 요소로 하는 배열을 리턴합니다.
  • 매칭이 하나도 안됐을 때를 대비해 옵셔널 체이닝 을 사용합니다.
  • 매칭된 문자열들로 reduce 메소드를 호출해, 모든 숫자들을 누산시킵니다.
  • 만약 매칭이 되어서 누적한 값이 있다면 그 값을 리턴하고, 매칭이 안되어 옵셔널 체이닝의 정의에 따라 undefined 를 리턴한다면, 0을 리턴하기 위해 OR 연산을 겸해줍니다.


코드

const fs = require("fs");
const stdin = (process.platform === "linux"
    ? fs.readFileSync("/dev/stdin").toString()
    : `5
ABCD
145C
A
A910
Z321`
).split("\n");
const input = (() => {
    let line = 0;
    return () => stdin[line++];
})();

let N = +input();
let arr = [];

while (N--) arr.push(input());

arr.sort((a, b) => {
    if (a.length != b.length) return a.length - b.length;
    let sum1 = sum(a),
        sum2 = sum(b);
    if (sum1 == sum2) return a.localeCompare(b);
    return sum1 - sum2;
});

console.log(arr.join("\n"));

function sum(str) {
    return str.match(/[\d]/g)?.reduce((sum, cur) => sum + +cur, 0) || 0;
}

카테고리:

업데이트:

댓글남기기