본문 바로가기

컴퓨터/백준 알고리즘

백준 알고리즘 1316번: 그룹 단어 체커 C언어

문제 출처: www.acmicpc.net/problem/1316

 

1316번: 그룹 단어 체커

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

www.acmicpc.net

1. 코드

#include <stdio.h>
#include <string.h>

int select(char a[], int len);

int main(void)
{
    int n, i, sum = 0;
    char arr[100];
    
    scanf("%d", &n);
    
    for(i = 0; i < n; i++)
    {
        scanf("%s", arr);        
        sum += select(arr, strlen(arr));
    }
    
    printf("%d", sum);
    return 0;
}

int select(char a[], int len)
{
    int i, j;
    int key = 0;
    
    for(i = 0; i < len; i++)
    {
        for(j = 0; j < len; j++)
        {
            if(a[i] == a[j])
            {
                key = j - i;
                
                if(key > 1)
                    if(a[j-1] != a[j])
                        return 0;
            }
        }
    }
    return 1;
}

2. 문제 해결 방식

먼저 n에 입력한 횟수만큼 문자열을 입력한다. 그 문자열이 저장된 배열과 배열의 길이를 함수로 보냅니다. 보내진 함수는 그룹 단어일 때 1로 반환하여 sum에 저장이 되고 만약 그룹 단어가 아닐 시에는 0이 반환되어 sum에 0이 더해지는 것이다.

그리고 이중 반복문을 통하여 한 배열을 변수를 사용하여 두 개의 변수를 비교하듯이 비교를 하는데 만약 a[i]값과 a [j]의 값이 서로 같을 경우 key값을 생성하는데 key값이 만약 1을 초과하고 a [j-1] 값과 a [j] 값이 다를 경우 0을 반환한다. 즉 a [i] 값이랑 a [j]의 값이 같다는 것은 같은 단어라는 것인데 key값을 이용하여 i의 값과 j의 차이를 통해 단어의 위치를 파악할 수 있다. 그런데 만약 그것의 차이가 0이거나 1이라면 비교할 것도 없이 그룹 단어의 조건이기에 넘어가고 key의 값이 2 이상이라면 그룹 단어인지 아닌지 확인 작업에 들어가야 한다.

그래서 if(a[j-1] != a[j])를 넣은 것이다. 이것을 넣으므로 바로 전의 단어도 같은지 혹은 다른지 확인하여 다르다면 0을 반환하게 하고 아니라면 1을 반환하게 되는 것이다.

3. 느낀 점

이것을 풀 때 솔직히 뭐부터 해야 할지 막막했다. 하지만 입력하는 것부터 시작해서 차근차근하다 보니 점점 기틀이 마련해지고 코드가 점점 완성되어가고 있었다. 물론 2번 정도 예제를 넣었는데 예제의 답이 나와 제출했지만 틀렸다는 판정을 받았지만 처음 생각했던 것보다 수월하게 풀어낸 것 같다.