새소식

Baekjoon

[BaekJoon] 1431 번 시리얼 번호 문제 - (nodejs)

  • -
728x90
문제 번호 :  1431 번

문제 바로가기 https://www.acmicpc.net/problem/1431

 

<<< 문제 내용 >>>

 

const fs = require('fs');
const filePath = process.platform === 'linux' ? '/dev/stdin' : './input.txt';
let input = fs.readFileSync(filePath).toString().trim().split('\r\n');

input.shift();

input.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(input.join('\n'));

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

* 하드코딩 후 다른 사람의 코드를 참고하고, 굉장한 사실을 알게 되었습니다.

 

바로 JavaScript에서 제공하는 옵셔널체이닝Regex(정규식)입니다.

 

정규식은 알고있었지만, 옵셔널체이닝과 연결시켜 이렇게 계산을 쉽게할 수 있다니..

 

간략하게 설명하자면,

match를 통해 [\d]로 배열 중 숫자만 추려내는 것입니다.

이때, 뒤에 g를 붙이면서 찾고 멈추지 않고, 전부 다 찾도록 합니다.

그리고 바로 여기서 옵셔널체이닝의 ?.을 사용합니다.

 

 옵셔널 체이닝이란?

옵셔널체이닝은 프로퍼티가 없는 객체나 빈 배열에 접근할 때 오류없이 안전하게 접근하기 위한 방식인데,

이 코드의 예시에서는 str.match(/[\d]/g)에다가 ?.를 붙임으로써 숫자를 찾지 못해도 오류가 아닌 undefined를 리턴합니다.

 

그리고나서 reduce를 통해 배열에 있는 모든 숫자를 다 더해주는 것인데, 이 때 reduce 안의 0은 더할게 없을 때의 초기값이고, 밖의 || 0 은 옵셔널체이닝의 undefined를 리턴하면 계산할 수 없기 때문에, OR을 이용하여 0을 리턴하게끔 합니다.

 

 

굉장히 유용한 문법인 것 같습니다.

 

 

 

 

도움이 되셨다면 공감 부탁드립니다.

Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.