문제 번호 : 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을 리턴하게끔 합니다.
굉장히 유용한 문법인 것 같습니다.
도움이 되셨다면 공감 부탁드립니다.