문자열이 하나 주어진다.
이 때, 문자열에서 모든 문자가 연속해서 나타나는 문자열을 "그룹 단어"라고 한다.
(예 : aabbccb에서 a와 c는 연속해서 존재하지만, b는 사이에 cc라는 단어 때문에 연속하지 않으므로 그룹 단어가 아니다)
단어 N개를 입력 받았을 때, 그룹 단어 개수를 모두 구하는 문제이다.
문자는 a~z까지 총 26가지 존재한다.
따라서, a~z와 대응할 수 있는 int형 배열을 만든 이후 3가지 Case로 쪼갰다.
arr[x]=0
x라는 문자가 해당 문자열에서 처음 나왔음
arr[x]=1
x라는 문자가 이전에 연속된 문자열로 나온 경우가 존재함
arr[x] = 2
x라는 문자가 현재 연속되고 있는 문자임
예를 들어, aabbccd라는 문자가 있을 때, d를 검사할 순서라고 가정하자.
먼저 d는 이전에 검사하지 않았던 문자이므로 arr[d] = 0의 값을 가지고 있을 것이다.
그리고, 이제 처음으로 검사한 값이므로 arr[d] = 2로 변경되어야 할 것이다.
또한 c라는 단어는 이전에 연속되고 있다는 문자로써 arr[c] = 2의 값을 가지고 있었을 것이다.
그런데 이제는 d를 검사할 것이므로 arr[c] = 1로 값을 변경해야 할 것이다.
마지막으로 a, b는 이미 연속되었으며 확인했던 문자이므로 arr[a] = arr[b] = 1일 것이다.
그렇다면 그룹 단어를 어떻게 확인할 수 있을까?
답은 간단하다. 현재 검사하고 있는 단어가 X일 때, arr[X] = 1이라면 이전에 확인했던 단어인데 다시 나왔다는 의미이고, 이는 같은 단어 사이에 다른 단어(혹은 문자열)이 포함되어 있다는 의미이므로 그룹 단어가 아니라는 의미이다.
import java.io.*;
import java.util.*;
public class Main {
static StringBuilder sb = new StringBuilder();
public static void main(String[] args) {
FastReader sc = new FastReader();
int N = sc.nextInt();
int answer = N;
// 모든 단어가 그룹 단어라면 답은 N
for(int i =0;i<N;i++) {
int[] arr = new int[26];
String s = sc.next();
int before_idx = -1;
for(int j =0;j<s.length();j++) {
int idx = s.charAt(j) - 'a';
if(arr[idx]==0) {
// idx 단어가 처음 체크되는 단어임
arr[idx] = 2;
if(before_idx!=-1) {
// idx 이전에 연속되었던 단어에 대응되는 배열값을 1로 만듦
arr[before_idx] = 1;
}
before_idx = idx;
// 현재 연속임을 확인해야할 값은 idx로 바뀌었음
}
else if(arr[idx] == 1) {
// idx 단어가 이전에 체크가 완료되었던 단어임
// 그룹 단어가 아니므로 1을 빼준다.
answer--;
break;
}
}
}
System.out.println(answer);
}
static class FastReader // 빠른 입력을 위한 클래스
}