티스토리 뷰

반응형

1. 문제

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

 

1316번: 그룹 단어 체커

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

www.acmicpc.net

1316번 그룹 단어 체커

 

2. 해결방안

그룹 단어란 각 문자가 연속해서 나타나야만 한다.

예를 들어, aabbccca도 연속으로 나타나고 b도 연속으로 나타나고 c도 연속으로 나타나기 때문에

그룹단어라고 할 수 있다.

 

하지만 aabbcca 같이 bc는 연속으로 나타나지만 a알파벳은 맨 끝에 동떨어진 a가 있기 때문에

이 케이스는 그룹단어가 아니라고 할 수 있다.

 

문제 이해가 끝났으니 이제 구현을 해보자.

단어를 입력받아 처음 알파벳부터 끝 알파벳까지 순회하며 검사를 진행할것인데

순회를 하면서 a~z까지의 알파벳의 최신위치(인덱스)를 계속 갱신할 것이다.

그러다가 이전에 갱신한 알파벳과 현재의 알파벳 위치가 2칸이상 차이나게 되면

그 즉시 반복문을 빠져나와 boolean 값을 false로 바꾸고 카운팅을 하지 않게 만들 것이다.

 

그림으로 요약하자면 다음과 같다.

처음부터 끝까지 순회하며 알파벳의 최신위치를 기록하는 것을 보인것이다

물론 인덱스배열의 초기값을 -1로 초기화 할 것이기 때문에

순회를하면서 이전 인덱스가 -1값이 아닐 때만 조건을 확인할 것이다.

 

여기까지를 바탕으로 코드를 짜보도록 한다.

 

3. 풀이

/**
 * Written by 0xc0de1dea
 * Email : 0xc0de1dea@gmail.com
 */

public class Main {
    public static void main(String[] args) throws Exception {
        //System.setIn(new java.io.FileInputStream("input.in"));
        Reader in = new Reader();

        int n = in.nextInt();
        int counting = 0;
        
        for (int i = 0; i < n; i++){
            char[] word = in.nextString().toCharArray();
            int[] prevIdx = new int[26];

            for (int j = 0; j < 26; j++){
                prevIdx[j] = -1;
            }

            boolean flag = true;
            
            for (int j = 0; j < word.length; j++){
                int prev = prevIdx[word[j] - 'a'];
                if (prev != -1 && j - prev > 1){
                    flag = false;
                    break;
                }
                prevIdx[word[j] - 'a'] = j;
            }

            if (flag){
                counting++;
            }
        }

        System.out.print(counting);
    }
}

class Reader {
    final int SIZE = 1 << 13;
    byte[] buffer = new byte[SIZE];
    int index, size;

    String nextString() throws Exception {
        StringBuilder sb = new StringBuilder();
        byte c;
        while ((c = read()) < 32) { if (size < 0) return "endLine"; }
        do sb.appendCodePoint(c);
        while ((c = read()) >= 32); // SPACE 분리라면 >로, 줄당 분리라면 >=로
        return sb.toString();
    }

    char nextChar() throws Exception {
        byte c;
        while ((c = read()) < 32); // SPACE 분리라면 <=로, SPACE 무시라면 <로
        return (char)c;
    }
    
    int nextInt() throws Exception {
        int n = 0;
        byte c;
        boolean isMinus = false;
        while ((c = read()) <= 32) { if (size < 0) return -1; }
        if (c == 45) { c = read(); isMinus = true; }
        do n = (n << 3) + (n << 1) + (c & 15);
        while (isNumber(c = read()));
        return isMinus ? ~n + 1 : n;
    }

    long nextLong() throws Exception {
        long n = 0;
        byte c;
        boolean isMinus = false;
        while ((c = read()) <= 32);
        if (c == 45) { c = read(); isMinus = true; }
        do n = (n << 3) + (n << 1) + (c & 15);
        while (isNumber(c = read()));
        return isMinus ? ~n + 1 : n;
    }

    double nextDouble() throws Exception {
        double n = 0, div = 1;
        byte c;
        boolean isMinus = false;
        while ((c = read()) <= 32) { if (size < 0) return -12345; }
        if (c == 45) { c = read(); isMinus = true; }
        else if (c == 46) { c = read(); }
        do n = (n * 10) + (c & 15);
        while (isNumber(c = read()));
        if (c == 46) { while (isNumber(c = read())){ n += (c - 48) / (div *= 10); }}
        return isMinus ? -n : n;
    }

    boolean isNumber(byte c) {
        return 47 < c && c < 58;
    }

    boolean isAlphabet(byte c){
        return (64 < c && c < 91) || (96 < c && c < 123);
    }

    byte read() throws Exception {
        if (index == size) {
            size = System.in.read(buffer, index = 0, SIZE);
            if (size < 0) buffer[0] = -1;
        }
        return buffer[index++];
    }
}

 

반응형
최근에 올라온 글