본문 바로가기

Algorithm

[Java] 백준 1316번 : 그룹 단어 체커

1. 문제

https://www.acmicpc.net/problem/1316

 

1316번: 그룹 단어 체커

그룹 단어란 단어에 존재하는 모든 문자에 대해서, 각 문자가 연속해서 나타나는 경우만을 말한다. 예를 들면, ccazzzzbb는 c, a, z, b가 모두 연속해서 나타나고, kin도 k, i, n이 연속해서 나타나기 때

www.acmicpc.net

2. 풀이

- 문제 핵심은 입력에 주어진 문자가 연속적으로 들어오는지 확인 이전에 들어왔던 문자가 같은지가 핵심이다. 

- boolean 배열을 활용하여 풀이

  • 테스트 케이스가 주어지고 for문 안에 문자열을 입력한다.
  • 각 문자열 마다 확인을 해주어야 함으로써 배열 초기화를 위하여 boolean 변수를 담은 배열을 for문 안에 생성한다. (알파벳 개수에 비례하여 26칸)
  • check 라는 boolean 변수를 생성한다.
  • 문자열 길이만큼 반복하는 for문을 만들어주고, charAt(j)으로 쪼개어 준다. (charAt(j) - 97 은 아스키코드로 변환 시 소문자 a는 97이라는 값을 가지고 있어, 해당 문자 - 97을 해준것이다.)
  • 조건을 주어 arr[ch] 번째에 true를 만들어주고, 이중 if을 통하여 j번째 값과 j-1번째 값이 같지 않은지 확인한다. 같지 않으면 boolean변수를 false로 바꾸어 주고 해당 for문을 break문을 통해 나온다.

- boolean 배열의 초기값은 false를 가지고 있어서. 처음에는 무조건 else로 빠져나가게 될 것이다.

- 인덱스 안에 값이 true에 해당하고, 이전에 값이 같지 않으면 이미 그룹단어가 아니라는 것에 해당하기에 바로 빠져나오도록 해놓은 것이다.

3. 코드

package review;

import java.util.Scanner;

public class Q1316_220214 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        int n = scanner.nextInt();
        int count = 0;

        for (int i = 0; i < n; i++) {
            String str = scanner.next();
            boolean[] arr = new boolean[26];
            boolean check = true;

            for (int j = 0; j < str.length(); j++) {
                int ch = str.charAt(j) - 97;
                if (arr[ch]) {
                    if (str.charAt(j) != str.charAt(j - 1)) {
                        check = false;
                        break;
                    }
                } else {
                    arr[ch] = true;
                }
            }
            if (check) {
                count++;
            }
        }
        System.out.println(count);
    }
}