개발자 첫걸음/백준

백준 문자열 9 - 크로아티아 알파벳 [2941]

프로아마추어 2022. 10. 7. 02:38

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

 

2941번: 크로아티아 알파벳

예전에는 운영체제에서 크로아티아 알파벳을 입력할 수가 없었다. 따라서, 다음과 같이 크로아티아 알파벳을 변경해서 입력했다. 크로아티아 알파벳 변경 č c= ć c- dž dz= đ d- lj lj nj nj š s= ž z=

www.acmicpc.net

 

문제

1. 입력 값으로 문자열이 주어진다.
2. 위의 크로아티아 알파벳에 일치하는 문자라면 단어 1개로 취급한다.
3. 문자열의 단어의 개수를 출력하라.

 

입출력 예시

 

나의 답안

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
let str = require("fs")
  .readFileSync(0)
  .toString()
  .trim();
 
const croatia = ["dz=""c=""c-""d-""lj""nj""s=""z="];
 
const findWord = (str, range) => {
  // [0] ~ [range] 까지의 문자열을 탐색한다.
  shortStr = str.slice(0, range);
 
  // 크로아티아 배열의 원소와 일치한다면 카운트 증가
  // 일치하는 범위 만큼의 문자열은 삭제하여 반환한다.
  if (croatia.includes(shortStr)) {
    cnt++;
    return str.replace(shortStr, "");
  }
 
  // [0] ~ [2]
  // [0] ~ [1]
  // 위 범위까지의 문자열은 크로아티아 문자열과 일치하지 않는다.
  // 카운트 증가  
  // + 제일 앞 문자 1개를 삭제하여 반환한다.
  if (range === 2) {
    cnt++;
    return str.replace(str[0], "");
  } else {
    // 범위가 2가 아니라면 무조건 3이므로 문자열 원본을 반환한다.
    return str;
  }
};
 
let cnt = 0;
 
while (str.length !== 0) {
 
  // 문자열의 길이가 3 이상이면 
  if (str.length >= 3) {
    const newStr = findWord(str, 3);
 
    // 반환 결과와 원본 문자열 길이가 다르면 
    // 새로운 문자열의 탐색을 위해 아래 조건문은 생략한다.
    if (str !== newStr) {
      str = newStr;
      continue;
    }
  }
 
  // 문자열의 길이가 2 이상이면 
  if (str.length >= 2) {
    str = findWord(str, 2);
  }
 
  // 문자열의 길이가 1이면 더 이상 찾고자 하는 문자가 없으므로
  if (str.length === 1) {
    str = "";
    cnt++;
  }
}
 
console.log(cnt);
 
cs
1. slice 메서드를 사용하면 자른 범위 만큼의 문자열을 반환한다.
2. replace 메서드를 사용하면 일치하는 첫 문자열에만 적용된다.

최대한 간략하고 효율적으로 코드를 짜보려고 노력했다. 여전히 중복되는 부분과 불필요한 부분이 보여 고치고 싶다.