문제
예전에는 운영체제에서 크로아티아 알파벳을 입력할 수가 없었다. 따라서, 다음과 같이 크로아티아 알파벳을 변경해서 입력했다.
| 크로아티아 알파벳 | 변경 |
|---|---|
| č | c= |
| ć | c- |
| dž | dz= |
| đ | d- |
| lj | lj |
| nj | nj |
| š | s= |
| ž | z= |
예를 들어, ljes=njak은 크로아티아 알파벳 6개(lj, e, š, nj, a, k)로 이루어져 있다. 단어가 주어졌을 때, 몇 개의 크로아티아 알파벳으로 이루어져 있는지 출력한다.
dž는 무조건 하나의 알파벳으로 쓰이고, d와 ž가 분리된 것으로 보지 않는다. lj와 nj도 마찬가지이다. 위 목록에 없는 알파벳은 한 글자씩 센다.
입력
첫째 줄에 최대 100글자의 단어가 주어진다. 알파벳 소문자와 ’-’, ’=‘로만 이루어져 있다.
단어는 크로아티아 알파벳으로 이루어져 있다. 문제 설명의 표에 나와있는 알파벳은 변경된 형태로 입력된다.
출력
입력으로 주어진 단어가 몇 개의 크로아티아 알파벳으로 이루어져 있는지 출력한다.
==============
풀이 및 답변
코드가 길어질 수 있는 문제. 여기에 작성한 답변은 여러가지의 풀이 방식을 참고한 것이다.
체크할 예외의 수가 8개라 하나 하나 if문으로 처리를 할 수 있겠지만, 예외가 많아질 경우에는 이 방법을 사용하는 것이 불가능하므로 간편한 방법을 찾아보고 싶었다.
정규식을 사용해서 replace하는 방법이 있다고 한다. 하지만 체크해야할 크로아티아 알파벳이 추가되거나 삭제 될 경우 정규식을 직접 수정해야 하므로… 실제로 사용해야 한다면 조금 번거로운 일이 생길 수도 있다.
따라서 1) solution 함수와 크로아티아 알파벳의 배열을 완전히 분리하고, 2) 배열의 값이 변경되어도 함수에 영향을 주지 않는 방식(함수를 수정하지 않아도 되는)으로 풀어보았다.
const input = require('fs').readFileSync('/dev/stdin').toString().trim();
const croatia = ['c=', 'c-', 'dz=', 'd-', 'lj', 'nj', 's=', 'z='];
let result = input;
const solution = (v) => {
for (let i = 0; i < croatia.length; i++) {
result = result.split(croatia[i]).join('A'); // 크로아티아 문자를 문자 1개로 변경
};
console.log(result.length);
};
solution(input);참고로 콘솔에 테스트하면 다음과 같다.
"ljes=njak"
"ljes=njak"
"ljes=njak"
"ljes=njak"
"Aes=njak"
"Aes=Aak"
"AeAAak"
"AeAAak"
6