import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int N = sc.nextInt();
int cnt = 0;
for(int i=0 ; i<N ; i++) {
String S = sc.next();
boolean check[] = new boolean[26];
boolean tmp = true;
for(int j=0 ; j<S.length() ; j++) {
int index = S.charAt(j)-'a';
if(check[index]) { //사용한 적 있음
if(S.charAt(j) != S.charAt(j-1)) { //이전과 연속 아님
tmp=false;
break;
}
}else {
check[index]=true;
}
}if(tmp) cnt++;
}
System.out.println(cnt);
}
}
abbcdad 를 예시로 살펴보자.
이 문제에서의 핵심 포인트는
이전에 사용한 적이 있는 문자 중 이전 알파벳과 연속이 아닌 것은 그룹 문자가 아니라는 것.
두번째 a가 출몰한 경우에..d와 연속이 아니기 때문에 그룹 룰이 깨진다.
이분법적 알파벳 검사와 관련된 문제는 예전에도 다루었듯,
26size의 boolean형 배열을 만들어 체크하는 방법을 떠올리는 것이 좋다.
본인은 그룹 단어이면 true, 그룹 단어가 아니라면 false로 하였다.
우선, 단어의 한 글자씩 검사해야하니 이에 대한 반복문을 만들고
알파벳 검사를 위해 앞서 만들어놨던 boolean배열에 접근하기 위해
소문자a를 index 0번으로 시작해 index 25번까지 설정하였다.
만약 check[index] = true (boolean의 기본값은 false임) 즉, 사용한 적 있는 문자라면..
(사용 했냐 안했냐의 boolean값 변경은 else문에서 다룬다.)
다음으로 이전 알파벳과 연속인지를 확인하고 tmp를 false로 바꾸고 반복문을 탈출한다.
(이 때 이 경우는 그룹 문자가 아예 아니게 되기 때문에 break로 다음 test단어로 넘어간다.)
이후 tmp가 true라면 카운트를 1 증가시킨다.
사용한적 없는 문자라면 그 문자의 check를 true로 설정하여 다음 반복때
사용한적 있다는 if문에 걸리도록 한다.
이렇게 계속 검사를 하여 그룹 문자인지 아닌지 check한다!
어렵다
'백준 단계별' 카테고리의 다른 글
[Java] 백준 2738: 항렬 덧셈 (0) | 2023.01.25 |
---|---|
[Java] 백준 1712: 손익분기점 (0) | 2023.01.25 |
[Java] 백준 2941: 크로아티아 알파벳 (0) | 2023.01.19 |
[Java] 백준 5622: 다이얼 (0) | 2023.01.18 |
[Java] 백준 2908: 상수 (0) | 2023.01.18 |