문제
코드
function sol(input) {
let answer = 0;
const n = +input[0];
for (let i = 1; i <= n; i++) {
const word = input[i];
let prevWord = word[0];
let flag = 1;
for (let j = 1; j < word.length; j++) {
if (prevWord === word[j]) continue;
if (word.slice(j).includes(prevWord)) {
flag = 0;
break;
} else prevWord = word[j];
}
if (flag) answer++;
}
return answer;
}
const input = [];
require("readline")
.createInterface(process.stdin, process.stdout)
.on("line", (line) => {
input.push(line);
})
.on("close", () => {
console.log(sol(input));
process.exit();
});
풀이
그룹 단어란 단어에 존재하는 모든 문자에 대해서, 각 문자가 연속해서 나타나는 경우만을 말한다.
ccazzzzbb는 c, a, z, b가 모두 연속해서 나타나므로 그룹단어이다.
aabbbccb는 b가 떨어져서 나타나기 때문에 그룹 단어가 아니다.
단어 N개가 주어졌을 때 그룹 단어의 개수를 출력하자.
절차는 다음과 같다.
단어의 알파벳을 처음부터 순회한다.
1. 알파벳이 바뀌는 시점에서 남은 단어에서 중복된 알파벳이 존재하는지 확인한다.
2. 남은 단어에 중복된 알파벳이 있으면 그룹 단어가 아니다.
남은 단어에 중복된 알파벳이 없다면, 바뀐 알파벳을 기준으로 단어를 계속 순회하며 1,2번 단계를 반복한다.
단어의 끝까지 알파벳 중복이 발견되지 않는다면 그룹 단어의 개수를 하나 추가할 수 있다.
예를 들어 설명하면 다음과 같다.
aabbbccb 의 경우
a->b로 바뀌는 시점에서 bbbccb에서 a가 존재하는지 판단한다.
존재하지 않으므로 다음 알파벳 b로 넘어간다.
b->c로 바뀌는 시점에서 ccb에서 b가 존재하는지 판단한다.
남은 단어 ccb에 b가존재하므로 그룹 단어가 아니다. 바로 단어의 알파벳 순회를 종료한다.
aabbcc의 경우
a->b로 바뀌는 시점에서 bbcc에 a가 존재하지 않으므로 다음 알파벳 b로 넘어간다.
b->c로 바뀌는 시점에서 cc에 b가 존재하지 않으므로 다음 알파벳 c로 넘어간다.
c에서 더이상 바뀌는 알파벳이 없으므로 그룹 단어의 개수를 하나 추가할 수 있다.
'DS & Algorithm > baekjoon' 카테고리의 다른 글
[백준] 2231번 분해합 - JavaScript(NodeJS) (0) | 2021.07.16 |
---|---|
[백준] 3055번 탈출 - JavaScript(NodeJS) (0) | 2021.07.07 |
[백준] 1037번 약수 - JavaScript(NodeJS) (0) | 2021.07.01 |
[백준] 1152번 단어의 개수 - JavaScript(NodeJS) (0) | 2021.07.01 |
[백준] 15990번 1, 2, 3 더하기 5 - JavaScript(NodeJS) (0) | 2021.06.09 |