예전에 백준을 처음 풀었을 때 읽었던 글이 생각납니다.
백준 문제는 알고리즘을 푸는 것 이상으로 하나의 프로그램을 구현하는 거라는 내용이었는데 정확한 출처는 기억이 안 납니다.
그렇기 때문인지 몇몇 문제는 입력과 출력에 주의해야하는 것은 물론, 예외처리에도 신경써야 합니다.
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=가 그런 관계이지만 앞 글자가 다르기 때문에 괜찮습니다.