[BOJ] 2870 크로아티아 알파벳(정규표현식)

Lee Jooam·2022년 5월 2일
0

출처: [BOJ] 2870 크로아티아 알파벳

예전에 백준을 처음 풀었을 때 읽었던 글이 생각납니다.

백준 문제는 알고리즘을 푸는 것 이상으로 하나의 프로그램을 구현하는 거라는 내용이었는데 정확한 출처는 기억이 안 납니다.

그렇기 때문인지 몇몇 문제는 입력과 출력에 주의해야하는 것은 물론, 예외처리에도 신경써야 합니다.

풀이

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 = `aaaa`;

  solution(input);
}

function solution(input) {
  let _input = String(input);
  const regExp = /(lj)|(c\=)|(c\-)|(d\-)|(nj)|(s\=)|(z\=)|(dz\=)/g;

  console.log(_input.replace(regExp, '1').length);
}

process.platform == 'linux' ? initBOJ() : initTest();

문제는 최대한 간단하게 만들면 좋다고 생각했습니다. 일단 문제에서 주어진 표를 토대로 정규식을 생성합니다.

그리고 정규식에 매칭시킨 결과들을 모두 replace 메소드를 이용해 1로 변환합니다. 문자표에 따라 한 글자라는 것을 명시하기 위함입니다.

length에 반영되는 값이 1만 되기만 한다면 어떤 문자가 와도 괜찮습니다.

주의사항

이 문제는 몇 가지 주의사항이 있습니다.

일단 input이 순수한 숫자들만으로 들어올 수 있기 때문에 안전하게 형변환을 거쳐야 합니다.

replace는 string 객체의 메소드이기 때문입니다.

const str = 'Hello Worldd!!!';
const num = 123;
const regExp = /(Hello)|(Worldd!!!)|(World)|(Worldd!!)/g;

console.log(str.match(regExp));

다음과 같은 코드가 있을 때 출력은 어떻게 될까요? World 부분과 매칭되는 규칙이 여러 개입니다.

[ 'Hello', 'Worldd!!!' ]
const str = 'Hello Worldd!!!';
const num = 123;
const regExp = /(Hello)|(World)|(Worldd!!!)|(Worldd!!)/g;

console.log(str.match(regExp));
[ 'Hello', 'World' ]

정규식은 앞 글자부터 규칙을 보고, 매칭되는 가장 첫 번째 규칙으로 결과를 반환합니다.

그렇기 때문에 혹시 다른 규칙에 함께 매칭될 수 있는 경우는 순서에 유의해야 합니다.

문제에서는 dz=와 z=가 그런 관계이지만 앞 글자가 다르기 때문에 괜찮습니다.

profile
프론트엔드 개발자로 걸어가는 중입니다.

0개의 댓글