알고리즘 문제 풀기

백준 2941: 크로아티아 알파벳 - javascript(문자열)

Fo_rdang 2024. 3. 13. 14:58
반응형

문제 출처 

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

 

2941번: 크로아티아 알파벳

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

www.acmicpc.net

문제

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

크로아티아 알파벳변경
č 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
 

문제 풀이 힌트 

여러 풀이법으로 풀어볼 수 있다. 

01. replace를 활용한 풀이 

문제 풀이 코드 01. (replace를 활용한 풀이) 

let input = require('fs').readFileSync('/dev/stdin').toString().trim().split(' ');
input = input[0]; 

function solution(input){
    const croatian = ['c=','c-','dz=','d-','lj','nj','s=','z=']; 
    let answer = 0; 
    for(let i=0; i< croatian.length; i++){
        while(input !== input.replace(croatian[i], '')){
            answer +=1; 
            input = input.replace(croatian[i], ' '); 
        }
    }
    return answer + input.split(' ').join('').length; 
}

console.log(solution(input))

알고가는 ppoint01. 

01) const input = 으로 설정해놓고, input[0]을 재할당하려고 했을 때 런타임 에러가 떴다. 이런 실수는 치명적이다. 

문제 다 풀어놓고 틀릴래?

02) 이 경우 'dz='의 경우 'dz='와 'z=' 중에서 먼저 발견된 'dz='만을 대체한다는 것. 

 

문제 풀이 코드 02. 

문제 풀이 코드 03. 

내 틀린 풀이 코드 

let input = require('fs').readFileSync('/dev/stdin').toString().trim().split('\n')
input = input[0]; 
//반복문 돌면서 '해당 단어' 이거 포함하냐 물어보기 ? 
//있다면 빼기 CNT++; 
//나머지는 SPLIT('')을 통해 몇개인지 세고, CNT++; 
const croatia2 = ['c=', 'c-', 'd-', 'lj', 'nj', 's=','z=']; 
const croatia3 ='dz='
let answer = 0; 
let i = 0; 
while(i<= input.length-2){
  if(i <= input.length-3){
       let temp3 = input[i] + input[i+1] + input[i+2]; 
    if(croatia3.includes(temp3)){
        answer++; 
        input = input.slice(0, i) + input.slice(i+3);
        i=0; 
        }
     }
     if(i <= input.length-2){
        let temp2 = input[i] + input[i+1]; 
    if(croatia2.includes(temp2)){
        answer++; 
        input = input.slice(0, i) + input.slice(i+2); 
        i=0; 
         }      
     }
    i++; 
      }
answer += input.length;  
console.log(answer);
  1. 크로아티아 알파벳 변환 조건이 부족합니다. 예를 들어 'dz='의 경우 'd-', 'z='로 나눠서 처리되어야 합니다. 현재 코드에서는 'dz='를 단독으로 처리하고 있어서 'dz=', 'd-', 'z='를 제대로 구분하지 못합니다.
  2. 문자열을 수정하면서 반복문을 조작하는 것은 일반적으로 좋은 방법이 아닙니다. 이렇게 하면 인덱스와 반복 조건 등이 엉망이 될 수 있습니다.
  3. slice() 함수를 사용하여 문자열을 잘라내고 있지만, 이는 문자열의 특정 부분을 제거하는 것이 아니라 새로운 문자열을 반환합니다. 이는 원래의 문자열을 수정하지 않습니다.
  4. 불필요한 조건문과 변수가 있습니다.

수정한 코드 

let input = require('fs').readFileSync('/dev/stdin').toString().trim().split('\n');
input = input[0]; 

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

let answer = 0;
let i = 0;

while (i < input.length) {
    if (i <= input.length - 3) {
        let temp3 = input.substring(i, i + 3);
        if (temp3 === croatia3) {
            answer++;
            i += 3;
            continue;
        }
    }

    if (i <= input.length - 2) {
        let temp2 = input.substring(i, i + 2);
        if (croatia2.includes(temp2)) {
            answer++;
            i += 2;
            continue;
        }
    }

    answer++;
    i++;
}

console.log(answer);
반응형