Java/백준알고리즘

[Java] 백준알고리즘 #1316 그룹 단어 체커

Sehyeok20 2023. 10. 4. 18:58
반응형

백준알고리즘 #1316 그룹 단어 체커
백준알고리즘 #1316 그룹 단어 체커

문제의 조건에 부합하는 그룹 단어의 갯수를 출력해주는 프로그램을 작성해보자.

그룹단어의 조건에 포함되지 않는 것은 어떤 알파벳이 연속적으로 나오지 않는 경우이다.

ex) aaaabbbbccccdddda => a,b,c,d 모두 연속적으로 나오나 a가 맨 뒤에 다시 나오므로 그룹단어가 아님.

 

이제 우리는 이 단어가 그룹 단어인지 아닌지 판별하기 위해 각 알파벳을 저장해 둘 배열을 만든 후, 각 알파벳의 등장 여부를 판별하는 플래그를 세워 판단하면 되겠다.

이를 위해 배열을 먼저 만든다.

boolean[] flag = new boolean[26];
String word = sc.next();
flag[word.charAt(0) - 97] = true;

flag 라는 배열을 사용하기 위해 입력받은 문자를 한개씩 잘라 아스키코드로 활용한다. (아스키코드 a = 97)

첫번째 문자는 당연히 아직 나온적이 없으므로 이에 해당하는 문자는 true로 둔다.

for (int j = 1; j < word.length(); j++) {
    if (word.charAt(j) != word.charAt(j - 1)) {
        if (flag[word.charAt(j) - 97] == false) {
            flag[word.charAt(j) - 97] = true;
        } else {
            count++;
            break;
        }
    }
}
  1. 이제 두번째 문자부터 바로 앞 단어와 비교하고(연속적인 문자 확인)
  2. 연속적이지 않다면 해당 문자에 해당하는 flag 배열 값이 false 인지 확인한다.
  3. 1번 2번 조건을 모두 만족한다면 해당 배열 값을 true로 전환
  4. 1번 조건에 만족하나 2번 조건을 만족하지 않는다면
    (해당 문자가 직전 문자와 다르고, 배열 값이 true. => 이미 등장한 적이 있는 문자이다) 
    - count 값을 증가시켜준 후(이후 전체 단어 수에서 count값을 빼면 된다.)
    - break문으로 반복문을 빠져나간다(ababab등과 같은 경우 중복 체크 방지)
  5. 1번 2번 조건에 모두 부합하지 않는다면 그대로 통과.

위와 같은 절차로 해당 단어가 그룹 단어인지 확인하면 된다.

전체 코드를 보면 다음과 같다.

import java.util.Scanner;

public class Main {
    public static void main(String args[]) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int count = 0;
        for (int i = 0; i < n; i++) {
            boolean[] flag = new boolean[26];
            String word = sc.next();
            flag[word.charAt(0) - 97] = true;

            for (int j = 1; j < word.length(); j++) {
                if (word.charAt(j) != word.charAt(j - 1)) {
                    if (flag[word.charAt(j) - 97] == false) {
                        flag[word.charAt(j) - 97] = true;
                    } else {
                        count++;
                        break;
                    }
                }
            }
        }
        System.out.println(n - count);

    }

}

 

반응형