일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 톺아보기
- 백준
- K-Digital Credit
- 프로그래머스
- 개발자북클럽
- nomadcoders
- 제로베이스
- CodeStates
- 노마드 코더
- 최원영 저자
- 알고리즘
- SQLD
- 이해할 수 있는
- 비전공자를 위한
- 공부를 가장한 일기일지도
- 자격증
- 모던 자바스크립트 deep dive
- boj
- SQL 개발자
- IT 지식
- Do it! 시리즈
- 자바스크립트
- 오블완
- js
- 노개북
- 엘리스코딩
- 노마드코더
- javascript
- 티스토리챌린지
- 구름edu
- Today
- Total
개발자를 희망하는 초보의 자기개발 이야기
백준 2941번 크로아티아 알파벳 문제 - Node.js 본문

문제 원문 링크
문제
예전에는 운영체제에서 크로아티아 알파벳을 입력할 수가 없었다. 따라서, 다음과 같이 크로아티아 알파벳을 변경해서 입력했다.
크로아티아 알파벳변경č | 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
풀이1
const fs = require("fs");
const input = fs.readFileSync("/dev/stdin").toString().trim().split("");
let count = 0;
for (let i = 0; i < input.length; i++) {
if (input[i] === "c") {
if (input[i + 1] === "=" || input[i + 1] === "-") {
count++;
i++;
} else {
count++;
}
} else if (input[i] === "d") {
if (input[i + 1] === "-") {
count++;
i++;
} else if (input[i + 1] === "z" && input[i + 2] === "=") {
count++;
i += 2;
} else {
count++;
}
} else if (input[i] === "l") {
if (input[i + 1] === "j") {
count++;
i++;
} else {
count++;
}
} else if (input[i] === "n") {
if (input[i + 1] === "j") {
count++;
i++;
} else {
count++;
}
} else if (input[i] === "s") {
if (input[i + 1] === "=") {
count++;
i++;
} else {
count++;
}
} else if (input[i] === "z") {
if (input[i + 1] === "=") {
count++;
i++;
} else {
count++;
}
} else {
count++;
}
}
console.log(count);
if - else 구성으로 c d l n s z로 시작하는 문자열일 때, 바로 뒷 인덱스의 문자열이 =, -, j이면 묶어서 갯수를 세고,
뒷 인덱스의 문자열을 묶어서 갯수를 센 만큼 i의 값도 증가시켜서 묶은 문자열의 인덱스는 다음 계산에서 제외킨다.
그런데 if - else if - else 가 너무 많이 중첩되어 있어서 비효율적이고 가독성이 떨어진다.
풀이2
const fs = require("fs")
const input = fs.readFileSync('/dev/stdin').toString().trim();
const alpabet = ['c=', 'c-', 'dz=', 'd-', 'lj', 'nj', 's=', 'z='];
for (let i of alpabet) {
input = input.replaceAll(i, 'a');
}
console.log(input.length);
조금 더 효율적인 코드를 찾아봤다.
1. 크로아티아 알파벳에 해당하는 각 문자열을 배열에 담는다.
2. 배열을 순회하면서 해당 크로아티아 알파벳 문자열이 입력값에 있을 때 이를 'a'라는(또는 다른) 하나의 문자열로 치환한다.
3. 치환 완료된 최종 문자열의 길이가 총 알파벳의 갯수가 된다.
'자료구조&알고리즘 > BOJ(백준 온라인 저지)' 카테고리의 다른 글
백준 2738번 행렬 덧셈 - Node.js (0) | 2024.11.27 |
---|---|
백준 11478번 서로 다른 부분 문자열의 개수 문제 - Node.js (0) | 2024.11.12 |
백준 1157번 단어공부 문제 - Node.js (0) | 2024.11.10 |
백준 2444번 별 찍기 - 7 문제 - Node.js (0) | 2024.11.09 |
백준 25083번 새싹 문제 - Node.js (0) | 2024.11.08 |