반응형
-해법
import java.util.Arrays;
import java.util.Scanner;
public class Main{
public static void main(String[] args){
Scanner in = new Scanner(System.in);
int n = in.nextInt(); // 입력 될 문자열의 개수
int cnt = 0; // 그룹 단어의 수
String alph[] = new String[n]; // n개의 문자열 배열 생성
boolean alph_check[] = new boolean[26]; // 알파벳의 재등장 여부를 판단할 변수
for(int i=0;i<n;i++) { // 단어 입력
alph[i] = in.next();
}
for(int i =0;i<alph.length;i++){ // 문자열 배열 탐색
cnt++; // 그룹 단어라는 가정하에 +1 시킨 뒤 판단한다.
Arrays.fill(alph_check, false); // 단어마다 알파벳 재등장 여부를 판단할 배열을 초기화
for(int j=0;j<alph[i].length();j++){ // 한 단어를 탐색
// 단어의 마지막 숫자가 아니며 && 등장하지 않았던 알파벳이며 && 다음 알파벳과 일치하지 않으면
if(j!=alph[i].length()-1 && alph_check[alph[i].charAt(j)-97] == false && alph[i].charAt(j) != alph[i].charAt(j+1)) {
alph_check[alph[i].charAt(j)-97] = true; // 해당 알파벳의 그룹은 끝이므로 true로 체크한 뒤 넘어간다.
}else if(alph_check[alph[i].charAt(j)-97] == true) { // 이미 한 번 등장했던 알파벳이라면,
cnt-=1; // 그룹 단어라는 가정을 파기하고 -1 후
break; // 탐색종료
}
}
}
System.out.println(cnt); // 그룹 단어의 수 출력
in.close();
}
}
이 문제는 단어의 입력과 탐색을 하는 과정에서 연속으로 등장하는 알파벳을 판단하는 조건문을 세우는 것이 요점이라 할 수 있겠다. 즉, happy라는 단어를 예로 들어보면.
1. 완전 탐색 과정에서 h는 방문하지 않았으며 + 다음 나오는 알파벳과 동일하지 않으며 + 마지막 알파벳이 아니므로
=> 방문 체크를 한다.
2. a 역시 위와 같다.
3. 처음 등장하는 p는 1번과 같지만, 다음 단어가 동일하기 때문에 조건문을 무시하며 + 방문 체크되지 않았기 때문에 아직 그룹 단어 여부를 모르므로 다음 알파벳을 살펴본다.
4. 다음 알파벳 역시 p이지만, 1번과 동일하므로
=> 방문 체크를 한다.
5. 마지막 y는 마지막 알파벳이므로 첫 번째 조건문은 고려할 필요없이 단순히 방문 여부만 판단하면 된다.
=> 방문한적이 없으므로 그대로 반복문 종료
6. 결국 happy는 그룹 단어이다.
이와 같은 방식으로 하나의 단어씩 탐색을 수행하면 된다.
반응형