이문제의 key는 첫단어를 마주친 후, 다른단어가 하나라도 나오고, 다시 그 단어를 마주치면 그룹단어가 아니라는 것 이다.
처음에는 이문제를 state를 undefined 따로 정의해서 처음본 단어를 마주치면 바로 그단어를 제외한 문자열 생성후 다시 그안에서 for문을 돌려서 만약 다른단어를 마주치면 state를 true로, 그리고 만약 자기자신을 마주치면 조건문으로 state가 true이라면 state를 false로 업데이트, 각 단어가 탐색이 끝날때마다 state를 확인, 2라면 그 단어를 그룹에서 제외하고 1이라면 다른단어를 마주치고 다시 자기자신을 마주치지않은 상태이기때문에 그룹단어에 포함하려 했는데, 이 경우는 for문을 for문 안에서 또 반복해서 계속 돌려줘야 하기 때문에 코드의 복잡성이 너무 커진다.
letter 배열은 처음 발견된 글자를 넣고, (처음발견된 단어를따로 저장해서 indexof 나 includes를 사용해 발견된 단어인지 판단하는 것은 동일하다.)
탐색한 글자가 letter 배열에 존재할 경우,
해당 인덱스가 letter 배열의 마지막 요소가 아니라면 (이 부분으로 코드의 복잡성이 확 줄어듦)
이전에 탐색되었으나, 다른 처음 발견된 글자 탐색 후 다시 발견된 경우이므로
그룹 단어에서 제외하고, 결괏값을 담는 변수인 countGroupWord에 카운트 하지 않았다.
const input = fs.readFileSync(filePath()).toString().trim().split("\n")
// input = [ '3', 'happy', 'new', 'year' ]
const caseCount = Number(input[0]);
let countGroupWord = 0;
for (let i = 1; i <= caseCount; i++) {
const word = input[i]; // i=1 일때 'happy'
const letter = [];
let isGroupWord = true;
for (let j = 0; j < word.length; j++) {
if (letter.indexOf(word[j]) === -1) {
// j는 4일때 letter은 [h, a, p] 'p'가 이미있으므로 else문 실행
letter.push(word[j]);
} else {
if (letter.indexOf(word[j]) !== letter.length - 1) {
// 여기서 'p'가 letter에 마지막요소가 아니라면 처음단어를 탐색한후에 디른단어를
// 만나고 다시 그단어가 나온 것 이기 때문에 그룹단어에서 제외시킨다
isGroupWord = false;
break;
}
}
}
if (isGroupWord) {
countGroupWord += 1;
}
}
console.log(countGroupWord);