백준을 풀 때마다 느끼는 거지만 자바스크립트에게 참 불친절한 플랫폼이라는 생각이 듭니다.
몇몇 문제는 node js 환경에서 시간 제한이 빡빡한데, 다른 언어로는 더 비효율적인 방법으로 접근해도 해결이 될 때가 있습니다... 😐
몸을 비틀며 겨우 시간제한에 통과하고 나면 보람차기도 하지만 허탈한 감정도 생깁니다.
사실 이런 생각이 드는 건 기본 실력이 부족하기 때문일 수도 있겠네요. :(
function initBOJ() {
const readline = require('readline');
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout,
});
const input = [];
rl.on('line', (line) => {
input.push(line);
}).on('close', () => {
solution(input);
process.exit();
});
}
function initTest() {
const input = `4
01a2b3456cde478
000
345634563456345634563456345634563456345634563456345634563456345634563456345634563456345634563456345634563456345634563456
02james007
03bond
04austinpowers00
aaa`
.split('\n')
.map((data) => data.trim());
solution(input);
}
function solution(input) {
const regExp = /\d+/g;
const answer = [];
for (let i = 1; i < input.length; i++) {
if (input[i].match(regExp)) {
answer.push(...input[i].match(regExp));
}
}
answer.sort((a, b) => a - b);
console.log(answer.map(BigInt).join('\n'));
}
process.platform == 'linux' ? initBOJ() : initTest();
문제 제한 조건을 보면 최대 100글자라고 합니다. 이걸 그냥 Number에 넣으면 자리수가 너무 길기 때문에 지수 표기법으로 변환됩니다.
그리고 그걸 그대로 출력한다면 의도와 다른 프로그램이 됩니다.
문득 자바스크립트의 자료형에 BigInt가 있다는 게 떠올랐습니다.
사용해 본 적은 없지만 찾아보니 이름 그대로 커다란 수를 담을 때 사용하는 자료형입니다.
[
0n,
0n,
1n,
2n,
2n,
3n,
4n,
7n,
478n,
3456n,
345634563456345634563456345634563456345634563456345634563456345634563456345634563456345634563456345634563456345634563456n
]
다음은 출력은 BigInt를 그대로 출력했을 때 나타나는 값입니다. 보이는 바와 같이 값의 뒤에 n이 붙은 형태입니다.
BitInt로 자료를 담아야한다는 것만 알면 그 후로는 간단합니다.
정수형 문자를 match 메소드를 이용해 모두 추출하고, 그것을 answer 담습니다. 비내림차순으로 출력해야 하기 때문에 sort 처리도 해야 합니다.
그리고 join을 이용해 출력하면 끝입니다.
BigInt는 String으로 변환될 때 맨 끝의 n이 떼어지는데, join도 결과가 String으로 반환되기 때문에 정상적인 출력이 나옵니다.
0
0
1
2
2
3
4
7
478
3456
345634563456345634563456345634563456345634563456345634563456345634563456345634563456345634563456345634563456345634563456