[BOJ] 2870 수학숙제(정규표현식)

Lee Jooam·2022년 5월 2일
2
post-thumbnail

출처: [BOJ] 2870 수학숙제

백준을 풀 때마다 느끼는 거지만 자바스크립트에게 참 불친절한 플랫폼이라는 생각이 듭니다.

몇몇 문제는 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
profile
프론트엔드 개발자로 걸어가는 중입니다.

0개의 댓글