티스토리 뷰

문제

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

 

1316번: 그룹 단어 체커

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

www.acmicpc.net

언어

자바 JAVA

로직

배열 생성

알파벳 a-z까지 총 26개가 존재하므로 배열을 만들어준다.

boolean[] check = new boolean[26];

반복문

입력받은 문자열의 길이만큼 반복문 실행

boolean[] check = new boolean[26];

for (int i = 0; i < word.length(); i++) {
    ..생략
}

연속되는 문자인지 확인

  1. if문을 걸어 현재 index가 check 배열에서 true인지 false인지 판단한다.
    1. true : 현재 문자를 확인하기 전에 이미 나온 적이 있다. -> 그룹 단어 x
    2. false : 현재 문자가 처음으로 나왔다. 2번으로 이동
  2. 현재 index + 1부터 문자열의 끝까지 반복문을 돌린다. 
    1. 현재 index의 문자 = 현재 index + 1의 문자 : 연속되는 단어이므로 계속 반복문 실행
    2. 현재 index 문자 != 현재 index +1의 문자 : 더 이상 연속되는 단어가 아니므로 반복문 종료.

2-1의 경우 i++을 해야하는 이유 : i번째 인덱스와 j번째 인덱스가 같은 문자이기 때문이다. 따라서 i와 j번째 인덱스가 같은 문자를 언제까지 갖는지 체크하기 위함이다.

2-2의 경우 i = j - 1을 해야 하는 이유 : i번째 인덱스와 j번째 인덱스의 문자가 다르기 때문이다. j에 대한 for문이 종료되면 i번째 for문을 돌리기 위해 i++이 수행되고 i번째 인덱스에는 다른 문자를 만나 종료된 j번째 인덱스가 되기 때문이다.

for (int i = 0; i < word.length(); i++) {
    char c = word.charAt(i);
    // 그룹 단어 체커가 아닌 경우
    if (check[c - 'a']) {
        return false;
    }
    // 현재 index의 문자가 처음으로 나왔을 때
    check[c - 'a'] = true;
    // 연속되는 문자인지 확인 -> 새로운 문자를 만날 때까지 반복
    for (int j = i + 1; j < word.length(); j++) {
        char c2 = word.charAt(j);
        if (c != c2) {
            i = j - 1;
            break;
        }
        i++;
    }
}

 

 

최종 코드

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

public class Main {
    public static void main(String[] args) throws IOException {

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        int n = Integer.parseInt(br.readLine());
        int count = 0;
        for (int i = 0; i < n; i++) {
            String word = br.readLine();
            if (isContinuous(word)) {
                count++;
            }
        }

        System.out.println(count);
    }

    private static boolean isContinuous(String word) {
        boolean[] check = new boolean[26];

        for (int i = 0; i < word.length(); i++) {
            char c = word.charAt(i);
            if (check[c - 'a']) {
                return false;
            }
            check[c - 'a'] = true;
            for (int j = i + 1; j < word.length(); j++) {
                char c2 = word.charAt(j);
                if (c != c2) {
                    i = j - 1;
                    break;
                }
                i++;
            }
        }
        return true;
    }
}
Total
Today
Yesterday
최근에 올라온 글
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30