본문 바로가기

[BOJ] - JAVA

[백준] 1316 : 그룹 단어 체커 JAVA 풀이

1. 단어의 개수 N을 입력받는다.

2. 그룹단어가 아닌 단어의 개수를 셀 변수 cnt를 만든다.

3. N개의 스트링 배열을 만들고 단어를 하나씩 입력받는다.

4. 이미 나온 알파벳인지 체크하는 boolean형 배열 alphabet을 만들고 false로 초기화한다.

5. 입력받은 단어의 한 글자씩 검사한다.

    5-1. 이미 나왔던 글자라면? -> 앞글자가 같은 글자인지(연속되는지) 검사한다.

                                            -> 연속되지 않는다면 cnt++하고 break로 그 단어의 검사를 종료한다.

    5-2. 처음 나오는 글자라면? -> alphabet 배열에 그 알파벳의 자리를 true로 만든다.

6. N - cnt를 출력한다. (전체 단어 수 - 그룹단어가 아닌 단어 수)

 

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;

public class Main{
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        boolean[] alphabet = new boolean[26]; // 알파벳이 나왔는지 체크하는 배열
        int cnt = 0; // 그룹단어가 아닌 단어의 개수를 셀 변수
        int N = Integer.parseInt(br.readLine()); // 단어의 개수를 입력받음
        String[] str = new String[N]; // 단어의 개수만큼 스트링 배열 생성
        
        for(int j=0;j<N;j++){
            for(int i=0;i<26;i++) alphabet[i] = false; // 알파벳을 체크하는 배열을 false로 초기화
            
            str[j] = br.readLine(); // 단어 하나를 입력받아 스트링 배열에 저장
            
            for(int k=0;k<str[j].length();k++){ // 입력받은 단어의 길이만큼 반복함
                if(alphabet[str[j].charAt(k)-'a']){ // 단어의 알파벳이 이전에 등장했었는지 검사
                    if(k>0&&str[j].charAt(k)!=str[j].charAt(k-1)){ // 등장했었는데 앞글자가 다른 글자다 == 그룹단어가 아니다
                        cnt++; // 그룹 단어가 아니니 cnt++
                        break; // 이 단어를 더이상 검사할 필요가 없으니 break
                   }
                }
                alphabet[str[j].charAt(k)-'a']=true; // 처음 나오는 알파벳이라면 배열에 체크
            }
        }
        System.out.print(N-cnt); // 전체 단어 개수 중에서 그룹 단어가 아닌 것을 뺀 값을 출력함
    }
}

음....정답이긴 하지만 반복문이 너무 많고, 단어를 입력받는 스트링배열도 불필요해 보인다.

더 보완해봐야겠다.

 


import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;

public class Main{
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));         
        int cnt = 0;
        int N = Integer.parseInt(br.readLine());
        
        for(int j=0;j<N;j++){
            boolean[] alphabet = new boolean[26];
            String str = br.readLine();
            
            for(int k=0;k<str.length();k++){
                char c = str.charAt(k); // 현재 글자
    
                if(alphabet[c-'a']){ // 이미 등장했었다면
                    if(k>0&&c!=str.charAt(k-1)){ // 앞글자가 다르다면 == 그룹단어가 아님
                        cnt++; // cnt++
                        break; // 이 단어를 더 이상 검사할 필요가 없으니 break
                   }
                }
                alphabet[c-'a']=true; // 처음 등장한 단어라면 체크
            }
        }
        System.out.print(N-cnt);
    }
}

불필요한 스트링 배열을 없앴고, 자바에서 boolean형 변수의 default 값이 false 라는 걸 알게 돼서

등장여부를 체크하는 배열을 초기화하는 반복문도 삭제했다.

단어를 한 글자씩 검사할 때 현재 단어를 캐릭터 변수 c에 저장해서 좀 더 보기 좋게 만들었다.