이해가 조금 필요한 문제이다.
그룹 단어라는 특성을 먼저 파악한 후 특이한 케이스만 제거하는 방식으로 풀어가는 것이 좀 더 간단하다.
총 4가지 경우의 수가 있다.
1. i번째 단어와 i+1번째 단어가 다르며 이전에 등장하지 않은 경우.
2. i번째 단어와 i+1번째 단어가 다르며 이전에 등장한 경우. (특이한 경우 그룹단어가 아님)
3. i번째 단어와 i+1번째 단어가 같으며 이전에 등장하지 않은 경우.
4. i번째 단어와 i+1번째 단어가 다르며 이전에 등장한 경우. (특이한 경우 그룹 단어가 아님)
헷갈릴 수 있는 것이 닽은 단어가 연속으로 등장하는 경우이다. aaab와 같은 경우
이 부분은 그룹단어이므로 특이하지 않은 경우라고 생각하고 boolean 배열 a 자리를 true로만 바꿔주면 된다.
따라서 같은 문자가 반복되는 경우는 고려하지 않아도 되며, 우리가 고려해야하는 상황은 i번째와 i+1번째 문자가 다르면서
이전에 문자가 등장한 경우만 고려하면 된다.
주석에 헷갈렸던 부분을 작성해 두었으니 한번 읽어보는 것도 좋을 것 같다
import java.util.Scanner;
public class Main {
public static void main(String[] args) throws Exception {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
//반복 횟수 입력받기
int count = n;
// 특이케이스만 제외하는 방식으로 진행 할 것임. 따라서 일단 전체가 그룹단어라고 가정
for(int i = 0; i < n; i++) {
//여러 단어를 입력받기위한 반복문
String str = sc.next();
// 문자열 입력받기
boolean test [] = new boolean [26];
//알파벳이 이전에 나왔다면 true로 바꾸어 자장하기 위한 배열 기본 값은 false이다.
for(int j = 0; j < str.length()-1; j++) {
// 한 문자열과 다음 문자열을 비교하기 위해서 문자열 길이 -1까지 반복한다 에러 주의
if(str.charAt(j) != str.charAt(j+1)) {
// j번째 문자와 ㅓ+1번째 문자가 다른 경우
if(test[str.charAt(j+1)-97]==true) {
//j+1번째 단어가 true라는 것은 이전에 나온적 있는 문자라는 뜻이다.
count--; //그룹단어가 아니므로 차감
break; //그룹 단어가 아닐시 바로 반복문을 나와야 한다
//break문은 가까운 조건문이 아닌 반복문을 탈출한다는 것을 알고있자.
//그렇지 않다면 ababab와 같은 패턴이 등장하면 count에서 여러번 --하여 음수가 되어버리는 문제가 발생한다.
}
}
test[str.charAt(j) - 97] = true;
// j와 j+1번째 문자가 같다면 해당 문자에 해당하는 배열만 true처리하고 넘어간다
}
}
System.out.print(count);
sc.close();
}
}
'java' 카테고리의 다른 글
| 백준 11005 진법변환2 10진수를 N진법으로 java 자바 (0) | 2024.01.11 |
|---|---|
| 백준 2745 진법계산기 자바 java (0) | 2024.01.11 |
| 백준 2563 색종이 자바 java (1) | 2024.01.10 |
| 백준 2941 크로아티아 (0) | 2024.01.09 |
| 백준 1157 단어 공부 자바 java 해시맵 사용 (0) | 2024.01.09 |