개발자를 희망하는 초보의 자기개발 이야기

백준 2941번 크로아티아 알파벳 문제 - Node.js 본문

자료구조&알고리즘/BOJ(백준 온라인 저지)

백준 2941번 크로아티아 알파벳 문제 - Node.js

클라우드아실 2024. 11. 11. 22:58
반응형

문제 원문 링크

문제

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

크로아티아 알파벳변경
č c=
ć c-
dz=
đ d-
lj lj
nj nj
š s=
ž z=

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

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

입력

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

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

출력

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

예제 입력 1

ljes=njak

예제 출력 1

6

예제 입력 2

ddz=z=

예제 출력 2

3

예제 입력 3

nljj

예제 출력 3

3

예제 입력 4

c=c=

예제 출력 4

2

예제 입력 5

dz=ak

예제 출력 5

3

 

풀이1

const fs = require("fs");
const input = fs.readFileSync("/dev/stdin").toString().trim().split("");

let count = 0;

for (let i = 0; i < input.length; i++) {
  if (input[i] === "c") {
    if (input[i + 1] === "=" || input[i + 1] === "-") {
      count++;
      i++;
    } else {
      count++;
    }
  } else if (input[i] === "d") {
    if (input[i + 1] === "-") {
      count++;
      i++;
    } else if (input[i + 1] === "z" && input[i + 2] === "=") {
      count++;
      i += 2;
    } else {
      count++;
    }
  } else if (input[i] === "l") {
    if (input[i + 1] === "j") {
      count++;
      i++;
    } else {
      count++;
    }
  } else if (input[i] === "n") {
    if (input[i + 1] === "j") {
      count++;
      i++;
    } else {
      count++;
    }
  } else if (input[i] === "s") {
    if (input[i + 1] === "=") {
      count++;
      i++;
    } else {
      count++;
    }
  } else if (input[i] === "z") {
    if (input[i + 1] === "=") {
      count++;
      i++;
    } else {
      count++;
    }
  } else {
    count++;
  }
}
console.log(count);

if - else 구성으로 c d l n s z로 시작하는 문자열일 때, 바로 뒷 인덱스의 문자열이 =, -, j이면 묶어서 갯수를 세고,
뒷 인덱스의 문자열을 묶어서 갯수를 센 만큼 i의 값도 증가시켜서 묶은 문자열의 인덱스는 다음 계산에서 제외킨다.
그런데 if - else if - else 가 너무 많이 중첩되어 있어서 비효율적이고 가독성이 떨어진다.

풀이2

const fs = require("fs")
const input = fs.readFileSync('/dev/stdin').toString().trim();

const alpabet = ['c=', 'c-', 'dz=', 'd-', 'lj', 'nj', 's=', 'z='];

for (let i of alpabet) {
    input = input.replaceAll(i, 'a');
}

console.log(input.length);

조금 더 효율적인 코드를 찾아봤다.
1. 크로아티아 알파벳에 해당하는 각 문자열을 배열에 담는다.
2. 배열을 순회하면서 해당 크로아티아 알파벳 문자열이 입력값에 있을 때 이를 'a'라는(또는 다른) 하나의 문자열로 치환한다.
3. 치환 완료된 최종 문자열의 길이가 총 알파벳의 갯수가 된다.

반응형