[백준,BOJ 1316] 그룹 단어 체커(JAVA 구현)
코테/백준 온라인 저지(BOJ)

[백준,BOJ 1316] 그룹 단어 체커(JAVA 구현)

반응형

-해법

import java.util.Arrays;
import java.util.Scanner;

public class Main{
    public static void main(String[] args){
        Scanner in = new Scanner(System.in);
        
        int n = in.nextInt(); // 입력 될 문자열의 개수
        int cnt = 0; // 그룹 단어의 수 
        
        String alph[] = new String[n]; // n개의 문자열 배열 생성
        boolean alph_check[] = new boolean[26]; // 알파벳의 재등장 여부를 판단할 변수
        
        for(int i=0;i<n;i++) { // 단어 입력
        	alph[i] = in.next();
        }
        
        for(int i =0;i<alph.length;i++){  // 문자열 배열 탐색      	
            cnt++; // 그룹 단어라는 가정하에 +1 시킨 뒤 판단한다.
            Arrays.fill(alph_check, false); // 단어마다 알파벳 재등장 여부를 판단할 배열을 초기화          
            for(int j=0;j<alph[i].length();j++){ // 한 단어를 탐색
            	// 단어의 마지막 숫자가 아니며 && 등장하지 않았던 알파벳이며 && 다음 알파벳과 일치하지 않으면
            	if(j!=alph[i].length()-1 && alph_check[alph[i].charAt(j)-97] == false && alph[i].charAt(j) != alph[i].charAt(j+1)) {
            		alph_check[alph[i].charAt(j)-97] = true; // 해당 알파벳의 그룹은 끝이므로 true로 체크한 뒤 넘어간다.
            	}else if(alph_check[alph[i].charAt(j)-97] == true) { // 이미 한 번 등장했던 알파벳이라면,
            		cnt-=1; // 그룹 단어라는 가정을 파기하고 -1 후 
            		break; // 탐색종료            		
            	}
            }
        }
        
        System.out.println(cnt); // 그룹 단어의 수 출력
        
        in.close();
        
    }
}

  이 문제는 단어의 입력과 탐색을 하는 과정에서 연속으로 등장하는 알파벳을 판단하는 조건문을 세우는 것이 요점이라 할 수 있겠다. 즉, happy라는 단어를 예로 들어보면.

 

  1. 완전 탐색 과정에서 h는 방문하지 않았으며 + 다음 나오는 알파벳과 동일하지 않으며 + 마지막 알파벳이 아니므로

  => 방문 체크를 한다.

  2. a 역시 위와 같다.

  3. 처음 등장하는 p는 1번과 같지만, 다음 단어가 동일하기 때문에 조건문을 무시하며 + 방문 체크되지 않았기 때문에 아직 그룹 단어 여부를 모르므로 다음 알파벳을 살펴본다.

  4. 다음 알파벳 역시 p이지만, 1번과 동일하므로

  => 방문 체크를 한다.

  5. 마지막 y는 마지막 알파벳이므로 첫 번째 조건문은 고려할 필요없이 단순히 방문 여부만 판단하면 된다.

  => 방문한적이 없으므로 그대로 반복문 종료

  6. 결국 happy는 그룹 단어이다.

 

  이와 같은 방식으로 하나의 단어씩 탐색을 수행하면 된다.

반응형