문제
예전에는 운영체제에서 크로아티아 알파벳을 입력할 수가 없었다. 따라서, 다음과 같이 크로아티아 알파벳을 변경해서 입력했다.
| 크로아티아 알파벳 | 변경 |
| č | c= |
| ć | c- |
| dž | 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
'Algorithm > Baekjoon(Node.js)' 카테고리의 다른 글
| [JavaSrcipt] Baekjoon - 1316 : 그룹 단어 체커 ([...arr]전개연산자) (0) | 2021.09.18 |
|---|---|
| [JavaSrcipt] replace (0) | 2021.09.17 |
| [JavaSrcipt] Baekjoon - 5622 : 다이얼 (includes) (0) | 2021.09.16 |
| [JavaSrcipt] Baekjoon - 2908 : 상수 (reverse) (0) | 2021.09.15 |
| [JavaSrcipt] Baekjoon - 1152 : 단어의 개수 (0) | 2021.09.14 |