[백준] 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;
});
위 코드는 문제 규칙에 따른 정렬 기준을 나타냅니다.
- 두 문자열 a, b 의 길이가 다르다면, 짧은게 먼저 온다.
- 둘의 길이가 같다면, 문자열 a의 모든 숫자의 합과 b의 모든 숫자의 합을 비교해, 작은 합을 가지는 게 먼저 온다.
- 합까지 같다면, 사전순으로 비교한다.
위 코드에 문자열의 사전순 비교를 도와주는 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;
}
댓글남기기