Algorithm/Baekjoon(Node.js)

[JavaSrcipt] Baekjoon - 2941 : 크로아티아 알파벳 (replace)

비망노트 2021. 9. 17. 23:30

문제

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

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


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

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

입력

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

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

출력

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

 

예제입력 예제출력
ljes=njak 6
ddz=z= 3
nljj 3
c=c= 2
dz=ak 3

 

 

⭕ 풀이

const input=require('fs').readFileSync('/dev/stdin').toString().trim();
let alp = /c\=|c\-|dz\=|d\-|lj|nj|s\=|z\=/g;
let answer = input.replace(alp, ' ');

console.log(answer.length);

1. push로 각 크로아티아 알파벳과 일치할경우

새배열생성해서 push하도록 했는데

input을 split한게 아니므로 일치하지 않을경우를 하나하나 찾을 수 없었다.

그래서 replace를 사용해 임의의 문자로 변경해주려했는데

//g   저 //안에 문자를 넣어야했다.

하지만 처음에는 alp = [ c= ----------z=] 로 생성해주었던상황이라

for문안에서 alp[i]로 반복해서 교체해주려했지만 다 뜻대로 되지않았다.

 

2. push로 일치하는 크로아티아 알파벳만을 push한 배열을 생성해

input배열.filter(x => !alp.includes(x)));

차집합을 해보려했으나 역시

input이 배열이 아니기에 해결되지않았다.

 

이쯤되니 input을 배열화해야 풀수있을것같았는데

도무지 어떻게 split해야할지 감이 잡히질 않아 결국 다른분의 풀이를 참조했다.

 

 

✅ 다른분의 풀이

 

const word = require("fs").readFileSync("/dev/stdin").toString().trim();
const category = ["c=", "c-", "dz=", "d-", "lj", "nj", "s=", "z="];

function getAnswer(word) {
  let count = 0;

  for (let i = 0; i < category.length; ) {
    const val = word.indexOf(category[i]);
    if (val === -1) {
      i++;
    } else {
      word = word.replace(category[i], "1");
      count += 1;
    }
  }
  return word.length;
}

console.log(getAnswer(word));

크로아티아 알파벳 배열의 길이보다 적을때까지 반복하는데

입력값에서 크로아티아 알파벳i인덱스를 찾은 위치값을 선언해준다.

즉 한바퀴씩돌때마다 크로아티아 알파벳인덱스를 하나씩 찾아 val가 된다.

indexOf는 찾는값이 없으면 -1을 반환한다.

 

val 가 -1이면 즉 크로아티아알파벳i인덱스가 없으면 i를 증가시킨다.

 

하지만 -1이아닐경우 즉 i인덱스가 있다면 

입력값은 입력값에서 해당 i인덱스를 찾아 '1'(임의의문자)로 바꾼뒤

//이 과정에서 2글자 3글자였던 크로아티아 알파벳이 임의의문자에 1을 적어줌으로써 한글자로 바뀐다.

count를 1증가시킨다.

 

이렇게되면 첫번째예제 ljes=njak를 입력받을경우

1e11ak가 word가 되고 word.length는 6이 된다.

 

 

✅ replace

어떤 패턴에 일치하는 일부 또는 모든 부분이 교체된 새로운 문자열을 반환합니다.

그 패턴은 문자열이나 정규식(RegExp)이 될 수 있으며,

교체 문자열은 문자열이나 모든 매치에 대해서 호출된 함수일 수 있습니다.

pattern이 문자열 인 경우, 첫 번째 문자열만 치환이 되며 원래 문자열은 변경되지 않습니다.

const p = 'The quick brown fox jumps over the lazy dog. If the dog reacted, was it really lazy?';

console.log(p.replace('dog', 'monkey'));
// expected output: "The quick brown fox jumps over the lazy monkey. If the dog reacted, was it really lazy?"

 

 

 

-출처

https://www.acmicpc.net/problem/2941

 

https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/String/replace