알고리즘

백준 JS | 2941번 크로아티아 알파벳

3jun 2022. 5. 16. 23:05
출처 : 백준 온라인저지
https://www.acmicpc.net/problem/2941
 

4673번: 셀프 넘버

셀프 넘버는 1949년 인도 수학자 D.R. Kaprekar가 이름 붙였다. 양의 정수 n에 대해서 d(n)을 n과 n의 각 자리수를 더하는 함수라고 정의하자. 예를 들어, d(75) = 75+7+5 = 87이다. 양의 정수 n이 주어졌을 때,

www.acmicpc.net

 

문제

크로아티아 알파벳을 입력하기 위해 컴퓨터에서 입력가능하도록 크로아티아 알파벳을 변환해서 사용한다.

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

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

입력

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

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

 

출력

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

 

나의 답안 (오답)

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

// 입력값 복사
let arr = input;
const croatia = ['c=', 'c-', 'dz=', 'd-', 'lj', 'nj','s=', 'z='];

// 알파벳 갯수 카운트
let count = 0;


for( let i = 0; i < arr.length; i++) {
  // 입력값 2개씩 만들어 알바벳과 비교
  const two = arr[i] + arr[i+1];
  
  // 복사한 입력값에서 크로아티아 알파벳 부분을 크로아티아 알파벳이라는 의미로 'C'로 치환
  if(croatia.indexOf(two) !== -1) {
    arr = arr.split(two).join('C');
    
    // 크로아티아 알파벳은 치환되고 남은 배열의 길이를 알파벳 갯수 카운트에 할당
    count = arr.length;
  }
}

// 만약 dz= 가 포함된 경우 d, z= 2개의 값으로 인정되므로
//  dz= 가 입력값에 포함된 경우는 1을 빼준다. 
if(input.indexOf('dz=') !== -1) {
  count = count - 1;
}

console.log(count);

일단 입력된 값에서 크로아티아 알파벳을 찾되, 2개로 이루어진 알파벳만 찾는다.

그리고, dz= 의 경우 하나의 알파벳임에도 d, z= 2개로 계산되기 대문에

입력값에 dz= 가 포함된 경우 count 를 1 줄여준다.

 

여기까지 코드를 입력하고 나면, 문제에서 제시된 입출력값은 모두 잘 통과된다. 

하지만, 어떤 이유에서인지 답안을 제출하면 오답으로 확인된다.

 

아무래도 예외케이스가 존재하는 모양인데 방법을 찾을 수 없었다. 

 

다른 사람의 답안

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

let croatia = ['c=', 'c-', 'dz=', 'd-', 'lj', 'nj', 's=', 'z='];

function solution(input) {
        for (let alphabet of croatia) {
                input = input.split(alphabet).join('a');
        }
        return input.length;
}

console.log(solution(input));

내가 확인한 케이스 중에 가장 깔끔하면서 나의 로직과 유사한 코드이다.

입력값을 개별로 계산하지 않고,  크로아티아 알파벳 배열을 활용해서 자동적으로 알파벳들은 문자열 'a'로 교체한 뒤에 입력값인 input 의  length를 출력한다. 

 

개선해야할 사항

문제만 보지않고 입력값과 출력값을 모두 보고 코드를 짜면서 예외사항에 대한 고민 없이 현재 사례들에 해당하는 예외처리만 진행하여 예외 케이스에 제대로 대응하지 못해 문제를 맞추지 못하는 것 같다. 앞으로 입출력 값은 되도록이면 로직을 모두 구현한 후에 테스트 시에만 확인할수 있도록 하자.