solution()
메서드를 생성한다.solution()
메서드는 알파벳의 개수만큼의 boolean 배열을 선언해 문자열을 순회하면서 만난 문자 방문 여부를 체크한다.💡boolean 배열의 길이는 26이고 인덱스는 0부터 시작한다.
알파벳 소문자의 아스키코드는97
부터 시작하므로, 해당 알파벳의 중복 체크를 위해 문자에97
을 빼야 boolean 배열의 인덱스 값을 얻을 수 있다.
ex.a = 97, boolean 배열의 인덱스는 0
첫 번째 인덱스는 0
이므로 tmp
이라는 변수에 0
을 담는다.
6-1. tmp
과 현재 문자(int num = str.charAt(i)
)가 같다면, 다음 순회를 반복한다.
6-2. tmp
과 현재 문자(int num = str.charAt(i)
)가 같지 않다면, 중복 검사를 진행한다.
boolean 배열에 num-97
인덱스의 값을 확인한다.
7-1. 값이 true라면, 이미 이 전에 문자를 사용했다는 의미이므로 false를 return한다.
7-2. 값이 false라면, 중복된 문자가 없다는 의미이므로 해당 인덱스의 값을 true로 변경하고 순회를 통해 중복 검사를 하기 위해 tmp
을 num
값으로 변경한다.
public class Main {
static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
public static void main(String[] args) throws IOException {
int n = Integer.parseInt(br.readLine());
int count = 0;
for(int i = 0; i<n; i++) {
if(solution() == true) {
count++;
}
}
System.out.println(count);
}
public static boolean solution() throws IOException {
// string 값을 입력 받는다.
String str = br.readLine();
// boolean[]에 흔적을 남긴다.
boolean[] check = new boolean[26];
int tmp = 0;
// str.length()만큼 반복문
for(int i = 0; i < str.length(); i++) {
// 아스키코드
// 다음 글자가 tmp와 같다면, 중복 검사하지 않고
// 다음 글자가 tmp와 같지 않다면, 중복 검사를 한다.
int num = str.charAt(i);
if(tmp != num) {
// check[num] = false -> 그룹단어 ok
if(!check[num-97]) {
// check[num] => true로 바꾸고, tmp => num바꿈
check[num-97] = true;
tmp = num;
} else {
// 중복 검사 check[num] = true면? -> 그룹단어 아님
return false;
}
}
}
// 중복검사가 끝까지 정상적으로 이루어진 경우 그룹단어이다.
return true;
}
}