본문 바로가기

백준

1316)그룹 단어 체커

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


단어에서 각 문자가 연속해서 나타날 때 그 단어를 그룹 단어라고 한다.


예를 들어 aaabbc는 a,b,c가 연속해서 나타났기 때문에 그룹 단어이다.


반면 aaabbca는 a가 연속해서 나타나지 않았기 때문에 그룹 단어가 아니다.


이 문제를 살짝 어렵게 풀었다.


문자열을 저장하고 있는 배열을 S라고 하자.


aaabbc가 그룹 단어인지 확인하기 위한 알고리즘의 초기 상태는 아래와 같다.

S[jump]와 S[j]가 같은지 비교하고 인덱스 차이가 1인지 확인한다.(인덱스 차이가 1이 아니면 문자가 연속해서 나타난 것x)


문자가 연속해서 나타났다면 jump에 j값을 저장한다. (S[j]가 연속한 문자군 중에서 마지막일 때 바로 jump이후로 넘어가기 위함)


두 번째 실행한 모습은 아래와 같다.


세 번째 실행한 모습은 아래와 같다.

여기서 연속하는 'a'가 끝난다. 


만약 aaabbca처럼 'a'가 연속하지 않는 경우는 어떻게 될까?

위 그림처럼 S[jump]와 S[j]는 같지만 인덱스 값 차이가 1이 아니기 때문에 그룹 단어라고 볼 수 없다.


이 경우 그룹 단어가 아님을 알았으니 그룹 단어로 세지 않고 알고리즘을 종료한다.


정상적으로 종료되는 경우를 생각해보자.

위 그림은 j를 계속 증가시켜 S[jump]와 S[j]가 같은지 비교했지만 더 이상 같지 않은 문자가 등장하지 않았다.


'a'를 갖고 문자열의 각 문자를 모두 비교하면 i는 'b'로 점프해 쓸데 없이 비교하는 경우를 줄인다.


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
31
32
33
34
35
36
37
38
39
#include<stdio.h>
#define TRUE 1
#define FALSE 0
 
int main() {
    int N;
    char tempStr[101];
    int jump = 0;
    int beGroup = TRUE;
    int count = 0;
 
    scanf("%d",&N);
    for (int i = 0; i < N;i++) {
        scanf("%s",tempStr);
 
        for (int i = 0; tempStr[i] != NULL; i++) {
 
            jump = i;
            for (int j = i + 1; tempStr[j] != NULL; j++) {
                if (tempStr[jump] == tempStr[j] && (j - jump) == 1) {
                    jump = j;
                }
                else if (tempStr[jump] == tempStr[j] && (j - jump) != 1) {
                    beGroup = FALSE;
                    break;
                }
            }
            i = jump;
 
            if (beGroup == FALSE) break;
        }
        count += beGroup;
        beGroup = TRUE;
    }
    printf("%d\n",count);
    
    system("pause");
    return 0;
}
cs







'백준' 카테고리의 다른 글

2775)부녀회장이 될테야  (0) 2019.01.16
5622)다이얼  (0) 2019.01.16
2920)음계  (0) 2019.01.15
8958)OX 퀴즈  (0) 2019.01.15
1065)한수  (0) 2019.01.14