안녕하세요. 개발자 움탱입니다.
이 기사는 알고리즘을 공부하면서 공부를 추적하기 위한 것입니다.
그래서 설명마다 일기장으로 편하게 쓰려고 하고 짧은 언어 형식으로 쓰려고 합니다.
그리고 더 좋은 시각이 있으시거나 잘 모르시는 부분이 있으시면 알려주시면 정말 감사하겠습니다.
좋은 하루 보내세요 🙂
문제
그룹 단어는 단어에 존재하는 모든 문자 중 각 문자가 순차적으로 나타나는 경우만을 말합니다. 예를 들어 ccazzzzbb는 c, a, z, b가 모두 순차적으로 나타나므로 그룹어이고 kin은 k, i, n이 차례로 나타나므로 그룹어이지만 aabbbccb는 b가 단독으로 나타나므로 그룹어가 아닙니다.
N 단어를 입력받아 그룹의 단어 수를 출력하는 프로그램을 작성하세요.
기입
단어 수 N이 첫 번째 줄에 입력됩니다. N은 100보다 작거나 같은 자연수이다. 단어는 두 번째 줄부터 N줄로 입력된다. 단어는 알파벳 소문자만 포함하고 겹치지 않으며 최대 100자까지 가능합니다.
누르다
첫 번째 줄에 그룹 단어의 수를 인쇄하십시오.
예

알고리즘 분류
- 화신
- 선
문제 설명
문제는 단순히 말로 문자가 없는 단어 세기(+) 하기 나름이다
별도의 알파벳이 있는 단어
- 아바, 아바, 바브…
별도의 문자가 없는 단어
- ab, abbbb, ba, cccc, abcdef…
설명
즉, 별도의 알파벳이 없는 단어를 세십시오.
전체 단어에서 분리된 문자가 있는 단어를 뺍니다.
단어에 분할알파벳이 있는지 알기 위해서는 다음과 같은 준비가 필요합니다.
- 현재 색인 바로 앞의 알파벳
- 현재 알파벳이 순회되었는지 여부를 기록하는 부울 배열입니다.
이후 이전알파벳과 현재알파벳이 다르면 이전알파벳이 통과되었는지 확인하고 맞으면 합계에서 빼줍니다.
암호
import java.io.BufferedReader;
import java.io.InputStreamReader;
public class Main {
public static void main(String() args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine()); //단어의 개수
int count = N;
for (int k = 0; k < N; k++) {
String s = br.readLine();
boolean() ckAlpha = new boolean('z' - 'a' + 1);
char prev = s.charAt(0);
ckAlpha(prev - 'a') = true;
for (int i = 1; i < s.length(); i++) {
char cur = s.charAt(i);
if (prev != cur && ckAlpha(cur - 'a')) {
count--;
break;
} else if (prev != cur && !ckAlpha(cur - 'a')) {
ckAlpha(cur - 'a') = true;
prev = cur;
}
}
}
System.out.println(count);
br.close();
}
}

