(Java) 백준 1316번 - 그룹 단어 체커

코딩너구리·2026년 1월 22일

코딩 문제 풀이

목록 보기
172/266

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

문제

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

> 단어 N개를 입력으로 받아 그룹 단어의 개수를 출력하는 프로그램을 작성하시오.

접근

모든 알파벳에 대해 각 알파벳을 인덱스로 가지는 boolean형 배열을 초기값은 false로 만든다. 또 입력받은 문자열을 순회하며 각 자리의 문자를 문자형 변수에 저장해둔다. 초기는 빈값을 저장해둔다.
이제 문자열을 순회 할 때, 저장해둔 직전 문자와 비교해서 같다면 넘어가고, 다르다면 현 문자를 알파벳 배열의 인덱스로 넣어본다. 이 때, true를 반환하면 즉, 나온적이 있으면 그룹단어 기준에 어긋나므로 순회를 그만한다. false를 계속 반환한다면 그룹단어가 된다.

문제해결

> 그룹단어가 아닌 단어의 수를 저장할 cnt를 선언해준다.
> 단어의 수 N을 입력받고 N만큼 그룹단어 체킹을 반복해준다.
> 매 단어 마다 등장유무를 체크하는 boolean형 배열을 초기화 해준다.
그렇지 않으면 전에 했던 문자들의 결과로 인해 오염된 값이 나온다.
> str에 단어를 입력받아주고 직전에 나왔던 문자를 저장할 변수 prev를 null로 초기화 해준다.
> 이제 단어의 길이만큼 반복하며 각 자리에 접근해 해당 문자가 직전 문자와 다를 때만 추가로 검증한다.
> 해당 문자에 문자 a를 빼 숫자로 변환 후 인덱스로 alpha 배열에 접근해 반환값을 보는데 true면 그룹단어가 아니므로 cnt를 누적하고 다음 단어로 넘어가준다.
> 위 조건에 걸리지 않으면 해당 문자는 나왔다고 alpha 배열에 마킹을 해주고, 직전 문자를 갱신해준다.

코드

import java.io.*;
import java.util.*;
import java.lang.*;

public class Main
{
    //1316번 그룹 단어 체커
    static boolean[] alpha = new boolean[26];
    public static void main(String[] args) throws IOException
    {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int N = Integer.parseInt(br.readLine());

        int cnt = 0;
        for(int j = 0; j < N; j++)
        {
            Arrays.fill(alpha, false);
            String str = br.readLine();

            char prev = '\0';
            for(int i = 0; i < str.length(); i++)
            {
                if(str.charAt(i) != prev) //직전문자랑 다른데
                {
                    if(alpha[str.charAt(i) - 'a'])
                    {
                        cnt++;
                        break; //나온적 있는 문자
                    }
                    alpha[str.charAt(i)-'a'] = true;
                    prev = str.charAt(i);
                }
            }
        }
        System.out.println(N-cnt);
    }
}

후기

조건의 순서가 조금 헷갈렸지만 so easy했다.

0개의 댓글