[백준] 2941 크로아티아 알파벳 JavaScript

·2024년 6월 6일

문제

예전에는 운영체제에서 크로아티아 알파벳을 입력할 수가 없었다. 따라서, 다음과 같이 크로아티아 알파벳을 변경해서 입력했다.

예를 들어, ljes=njak은 크로아티아 알파벳 6개(lj, e, š, nj, a, k)로 이루어져 있다. 단어가 주어졌을 때, 몇 개의 크로아티아 알파벳으로 이루어져 있는지 출력한다.

dž는 무조건 하나의 알파벳으로 쓰이고, d와 ž가 분리된 것으로 보지 않는다. lj와 nj도 마찬가지이다. 위 목록에 없는 알파벳은 한 글자씩 센다.

입력

첫째 줄에 최대 100글자의 단어가 주어진다. 알파벳 소문자와 '-', '='로만 이루어져 있다.

단어는 크로아티아 알파벳으로 이루어져 있다. 문제 설명의 표에 나와있는 알파벳은 변경된 형태로 입력된다.

출력

입력으로 주어진 단어가 몇 개의 크로아티아 알파벳으로 이루어져 있는지 출력한다.

예제 입력

ljes=njak

예제 출력

6

내가 했던 풀이 방법

  1. dictionary Set에 크로아티아 알파벳을 추가해준다.
  2. count를 0으로 초기화해준다.
  3. 단어를 처음부터 끝까지 한 자리씩 검사한다. 현재 검사하는 알파벳을 str에 저장한 뒤, 무한 반복문에 들어간다. 만약 i가 word의 마지막일 경우, 그냥 탈출한다. 현재 str에 다음 단어를 더한 문자가 dictionary에 있을 경우, str에 다음 문자를 더해주고, i를 1 증가시킨다. 만약 dictionary에 없지만, i+2가 word를 넘어가지 않고, dictionary에 검사한 문자가 "dz"이고, 그 다음 문자가 "="일 경우에는 str에 다음 문자를 더해주고, i를 증가시켜준다. 위 경우에 모두 해당하지 않을 경우 반복문을 탈출한다.
  4. 반복문이 끝났을 때까지 str에 저장된 단어가 하나의 알파벳이므로, count를 1 증가시켜준다.
  5. 모든 word의 알파벳을 검사한 뒤, count를 출력한다.

코드

var fs = require('fs');
let word = fs.readFileSync(0, 'utf-8').toString().trim();

let dictionary = new Set();
dictionary.add('c=');
dictionary.add('c-');
dictionary.add('c=');
dictionary.add('dz=');
dictionary.add('d-');
dictionary.add('lj');
dictionary.add('nj');
dictionary.add('s=');
dictionary.add('z=');

let count = 0;
for (let i = 0; i < word.length; i++) {
  let str = word.charAt(i);
  while (true) {
    if (i === word.length - 1) break;
    if (dictionary.has(str + word.charAt(i + 1))) {
      str += word.charAt(i + 1);
      i++;
    } else if (i + 2 < word.length && str + word.charAt(i + 1) === 'dz' && word.charAt(i + 2) === '=') {
      str += word.charAt(i + 1);
      i++;
    } else break;
  }
  count++;
}

console.log(count);

회고

딱 문제를 보고 구현해보니 딱 하나 문제였던 게 "dz="였다. 다른 알파벳들은 2글자로 고정되어 있어서 while문에 문제가 없었는데 "dz="만 세 글자라 "dz"까지만 검사하고 없는 알파벳으로 판단해버리게 됐던 것이다. dz만 해결해줄 방법만 찾으면 되길래 다른 방법을 생각하다가 그냥 dz만 예외로 처리하면 되잖아?하고 이렇게 구현했는데 정답이었다. JS로 풀이한 다른 풀이들을 보니 거의 대부분 replace를 이용했다. 이 방법이 더 간결한 것 같긴하지만 Set도 나쁘지 않은... 풀이 같...?은데?

profile
Frontend🍓

0개의 댓글