반응형
문제 출처
https://www.acmicpc.net/problem/2941
문제
예전에는 운영체제에서 크로아티아 알파벳을 입력할 수가 없었다. 따라서, 다음과 같이 크로아티아 알파벳을 변경해서 입력했다.
크로아티아 알파벳변경č | c= |
ć | c- |
dž | 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);
- 크로아티아 알파벳 변환 조건이 부족합니다. 예를 들어 'dz='의 경우 'd-', 'z='로 나눠서 처리되어야 합니다. 현재 코드에서는 'dz='를 단독으로 처리하고 있어서 'dz=', 'd-', 'z='를 제대로 구분하지 못합니다.
- 문자열을 수정하면서 반복문을 조작하는 것은 일반적으로 좋은 방법이 아닙니다. 이렇게 하면 인덱스와 반복 조건 등이 엉망이 될 수 있습니다.
- slice() 함수를 사용하여 문자열을 잘라내고 있지만, 이는 문자열의 특정 부분을 제거하는 것이 아니라 새로운 문자열을 반환합니다. 이는 원래의 문자열을 수정하지 않습니다.
- 불필요한 조건문과 변수가 있습니다.
수정한 코드
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);
반응형
'알고리즘 문제 풀기' 카테고리의 다른 글
백준 1189: 컴백홈 - javascript(dfs) (0) | 2024.03.13 |
---|---|
백준 10973: 이전 순열 - javascript(구현) (0) | 2024.03.13 |
백준 1476: 날짜 계산 - javascript (완전탐색) (0) | 2024.03.09 |
백준 2512: 예산 - javascript (이진탐색) (0) | 2024.03.09 |
백준 21736: 헌내기는 친구가 필요해 - javascript(dfs) (1) | 2024.03.07 |