백준 JS | 2941번 크로아티아 알파벳
출처 : 백준 온라인저지
https://www.acmicpc.net/problem/2941
문제
크로아티아 알파벳을 입력하기 위해 컴퓨터에서 입력가능하도록 크로아티아 알파벳을 변환해서 사용한다.
예를 들어, 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를 출력한다.
개선해야할 사항
문제만 보지않고 입력값과 출력값을 모두 보고 코드를 짜면서 예외사항에 대한 고민 없이 현재 사례들에 해당하는 예외처리만 진행하여 예외 케이스에 제대로 대응하지 못해 문제를 맞추지 못하는 것 같다. 앞으로 입출력 값은 되도록이면 로직을 모두 구현한 후에 테스트 시에만 확인할수 있도록 하자.