[백준 | Javascript] 1316

박기영·2022년 5월 20일
0

백준

목록 보기
53/127
post-custom-banner

문자열 10단계
1316번. 그룹 단어 체커

문제

그룹 단어란 단어에 존재하는 모든 문자에 대해서, 각 문자가 연속해서 나타나는 경우만을 말한다. 예를 들면, ccazzzzbb는 c, a, z, b가 모두 연속해서 나타나고, kin도 k, i, n이 연속해서 나타나기 때문에 그룹 단어이지만, aabbbccb는 b가 떨어져서 나타나기 때문에 그룹 단어가 아니다.
단어 N개를 입력으로 받아 그룹 단어의 개수를 출력하는 프로그램을 작성하시오.

입력

첫째 줄에 단어의 개수 N이 들어온다. N은 100보다 작거나 같은 자연수이다. 둘째 줄부터 N개의 줄에 단어가 들어온다. 단어는 알파벳 소문자로만 되어있고 중복되지 않으며, 길이는 최대 100이다.

출력

첫째 줄에 그룹 단어의 개수를 출력한다.

예제 입출력

예제 입력 1

3
happy
new
year

예제 출력 1

3

예제 입력 2

4
aba
abab
abcabc
a

예제 출력 2

1

예제 입력 3

5
ab
aa
aca
ba
bb

예제 출력 3

4

예제 입력 4

2
yzyzy
zyzyz

예제 출력 4

0

예제 입력 5

1
z

예제 출력 5

1

solution

const fs = require('fs');
const input = fs.readFileSync('/dev/stdin').toString().split('\n');

const iter = Number(input[0]);
let countGroupWord = 0;

for(let i = 1; i <= iter; i++){
  const str = input[i];
  let letter = [];
  let isGroupWord = true;

  // aaza가 들어왔다고 가정
  for(let j = 0; j < str.length; j++){
    // 배열에 해당 문자가 존재하지 않으면 배열 원소로 추가한다
    // 첫 번째 a가 push된다. letter는 ["a"]
    // 세 번째 z가 push된다. letter는 ["a", "z"]
    if(letter.indexOf(str[j]) === -1){
      letter.push(str[j]);
    } else{
      // 들어온 문자가 이미 배열에 존재한다면 이미 존재하는 문자의 인덱스 번호와
      // letter.length - 1이 같은지를 판별한다
      // 두 번째 a가 들어왔을 때, push가 되지않고, 첫 a의 인덱스는 0이므로
      // 인덱스 번호와 배열 길이에서 1을 뺀 것 숫자가 같다
      // 즉, 연속적으로 같은 문자가 들어왔다는 것을 의미
      // 이 때, letter는 ["a"]
      // z 다음의 a가 들어오게 되면 이미 a가 존재하므로 else 문을 실행
      // 첫 번째 a의 인덱스와 (인덱스 길이 - 1)이 다르므로 그룹 단어가 아님
      // 이 때, letter는 ["a", "z"]
      if(letter.indexOf(str[j]) !== letter.length - 1){
        isGroupWord = false;
        break;
      }
    }
  }

  if(isGroupWord){
    countGroupWord += 1;
  }
}

console.log(countGroupWord);

해설

이번 문제는 정말 다양한 풀이가 있었다.
나는 adzzzza같이 같은 문자가 세 번 이상 반복 될 때를 어떻게 처리할지를 두고 고민하다가, 결국 해결하지 못했는데, 가장 비슷하게 해결하신 분의 풀이를 가져와봤다. 참고 사이트
주석에 적어놓은 흐름을 잘 따라가보길 바란다. 이렇게 풀면 zzzz처럼 연속으로 세 개 이상이 들어오는 경우도 한번에 해결이 가능하다.

profile
나를 믿는 사람들을, 실망시키지 않도록
post-custom-banner

0개의 댓글