본문 바로가기
java

백준 1316 그룹단어 자바 java

by MiaCoder 2024. 1. 10.

 

이해가 조금 필요한 문제이다.

 

그룹 단어라는 특성을 먼저 파악한 후 특이한 케이스만 제거하는 방식으로 풀어가는 것이 좀 더 간단하다.

 

총 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();
    	
    	}
    }