/* 문제 */ 예전에는 운영체제에서 크로아티아 알파벳을 입력할 수가 없었다. 따라서, 다음과 같이 크로아티아 알파벳을 변경해서 입력했다. 예를 들어, ljes=njak은 크로아티아 알파벳 6개(lj, e, š, nj, a, k)로 이루어져 있다. 단어가 주어졌을 때, 몇 개의 크로아티아 알파벳으로 이루어져 있는지 출력한다. dž는 무조건 하나의 알파벳으로 쓰이고, d와 ž가 분리된 것으로 보지 않는다. lj와 nj도 마찬가지이다. 위 목록에 없는 알파벳은 한 글자씩 센다.
단어가 몇 개의 알파벳으로 이루어져 있는지만 출력하면 되기 때문에 전체 단어의 길이에서 한 글자로 취급되는 크로아티아 알파벳의 수를 빼주기만 하면 된다고 생각했다. 그렇게 작성한 첫 번째 코드는
// 틀린 코드
const fs = require("fs");
let input = fs.readFileSync("./dev/stdin").toString().trim();
const cr = ["c=", "c-", "dz=", "d-", "lj", "nj", "s=", "z="];
let mVal = 0;
for (let i = 0; i < 8; i++) {
let j = 0;
while (input.indexOf(cr[i], j) != -1) {
mVal++;
j += input.indexOf(cr[i], j) + 2;
}
}
console.log(input.length - mVal);
위와 같다.
크로아티아 알파벳을 모두 배열 cr에 저장한 후 입력 받은 단어에 크로아티아 알파벳이 있을 때마다 mVal(전체 단어 길이에서 뺄 값)을 1씩 증가시킨다. 같은 크로아티아 알파벳이 여러 개 있더라도 모두 찾아낼 수 있도록 while문으로 해당 알파벳이 더이상 나오지 않을 때까지 반복해서 검사한다. dz=의 경우에는 mVal을 2씩 증가시켜야 하는데, dz=를 검사할 때 한 번, z=를 검사할 때도 한 번 더 mVal을 증가시키기 때문에 제대로 처리가 된다.
답은 제대로 나오는데 백준에 제출하면 틀렸다고 나온다.
// 최종 코드(정답 코드)
const fs = require("fs");
let input = fs.readFileSync("./dev/stdin").toString().trim();
const cr = ["c=", "c-", "dz=", "d-", "lj", "nj", "s=", "z="];
for (let c of cr) {
input = input.split(c).join("a");
}
console.log(input.length);
숫자를 카운트하는 과정에서 틀린 로직이 있는 것 같은데, 크로아티아 문자를 모두 한 글자인 알파벳(임의로 a로 설정)으로 바꾸면 중복 카운팅 없이 잘 처리된다.