이 문제는 문자열을 순회하면서 특정 단어의 연속성이 끊긴 뒤에 다시 등장할 경우에 해당 문자열 자체를 그룹 단어라고 보지 않는 문제인데요.
즉, 'aaabbcc' 가 있다고 한다면 각 단어들은 같은 단어들 끼리 서로 연결이 되어있는 상태이므로 그룹 단어이고, 'aaabbcca'는 알파벳 a가 세 번 연속해서 등장하다가 끊기고, bbcc를 지나 다시 a가 등장하므로 해당 문자열 자체를 그룹 단어라고 보지 않겠다고 하는 것이죠.
그래서 저는 이 문제를 split과 shift를 활용해 해당 문제를 풀었습니다.
const fs = require('fs'); const input = fs.readFileSync("/dev/stdin").toString().trim().split('\n'); const n = Number(input[0]); // 입력되는 문자열의 개수 let result = 0; for(let i = 1; i <= n ; i++){ let arr = input[i].trim().split(''); //for문을 돌려 문자열 배열을 차례대로 선택하여 split으로 나눈 후 arr에 순회 할당 let length = arr.length // arr의 배열은 다음 for문에서 바뀔 것(shift) 이므로 해당 배열의 길이를 따로 length에 저장 let state = true; // 그룹 단어인지 아닌지를 표시하는 변수 let subArr = []; // 스택 for(let j = 0 ; j < length-1; j++){ // 선택된 문자열 배열의 길이만큼 for문 실행 subArr.unshift(arr.shift()); // arr의 앞자리 요소를 꺼내 subArr에 차례대로 적재 if(subArr[0] !== arr[0]){ // 만약 두 배열의 앞자리 요소가 다를 경우, 즉 연속성이 끊긴 경우 if(arr.includes(subArr[0]) !== -1){ // 다시 if문으로 subArr에 빼낸 문자가 arr에 존재할 때(indexOf를 이용하여 arr의 현재 문자의 인덱스가 subArr에 존재한다는건 해당 알파벳의 연속성이 끊겼음에도 불구하고 뒤쪽에 살아있음을 의미. 참고로 이 조건은 arr.includes(subArr[0]) 으로도 표현 가능 state = false; // state를 false로 재할당 break; // 현재 문자열 배열의 for루프 종료 } } } result += state === true ? 1 : 0; // 현재 단어의 state 상태가 true(그룹 단어) 라면 1을 result에 누적 할당, 아니면 0을 할당 (변화 없음) } console.log(result);