Notice
Recent Posts
Recent Comments
«   2025/03   »
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
Today
Total
Archives
관리 메뉴

cyphen156

백준-심화 1 1316 그룹 단어 체커 본문

컴퓨터공학/알고리듬 풀이

백준-심화 1 1316 그룹 단어 체커

cyphen156 2025. 1. 31. 13:09

그룹 단어 체커

각 문자가 연속해서 나타나는 경우를 체크해야 한다.

Ex) abbbcdde -> 그룹단어 a, bbb, c, dd, e

다음의 경우는 단어 중 일부가 연속되는 패턴이 깨졋기 때문에 그룹단어가 아니다.

Ex) aabbbcbdde -> 그룹단어 aa, c, dd, e / 그룹단어가 아닌 단어 bbb" "b

 

생각을 해보면 ... Case는 두개 정도 될 것 같다.

앞 문자와 뒤 문자를 같은 경우 -> 연속 판정

앞 문자와 뒤 문자가 다른 경우 -> 불연속 판정

단어 배열 쓰면 간단하겟다

제약사항

  • all Case Must Be Close Together
  • first Input value(N) Means Number of Word
  • 0 < N <= 100
  • each Word consist of lowerCase
  • 0 < Word <= 100

주의 사항

없다.

CPP풀이

그룹 단어 체커_1316.cpp

/**
 * 백준 그룹 단어 체커_1316
 * 각 문자가 연속해서 나타나는 경우를 체크해야 한다.
 * Ex) abbbcdde -> 그룹단어 a, bbb, c, dd, e
 * 다음의 경우는 단어 중 일부가 연속되는 패턴이 깨졋기 때문에 그룹단어가 아니다.
 * Ex) aabbbcbdde -> 그룹단어 aa, c, dd, e / 그룹단어가 아닌 단어 bbb" "b
 * 
 * 제한사항
 ************************************************
 * all Case Must Be Close Together              *
 * first Input value(N) Means Number of Word    *
 * 0 < N <= 100                                 *
 * each Word consist of lowerCase               *
 * 0 < Word <= 100                              *
 ************************************************
 *
 *
 *
 * 주의
 * 
 * 
 * 풀이시간 40분
 */


#include <iostream>

using namespace std;

int main(void)
{
    int numberOfCase, cnt = 0;
    cin >> numberOfCase;
    
    for (int i = 0; i < numberOfCase; ++i)
    {
        string str;
        cin >> str;
        bool isGroupWord = true;
        bool alpha[26] = { 0 };
        for (int j = 0; j < str.length(); ++j)
        {
            int index = str[j]-'a'; // 알파벳 위치 인덱싱
            if (str[j] != str[j+1]) 
            // 현재 단어랑 다음 단어가 다른 단어임 = 알파벳이 바뀌어 새로운 그룹단어를 형성함을 의미
            {   
                if (alpha[index])
                // 이미 한번 등장했던 그룹단어임 == 새로 등장할 때는 그룹단어가 아님을 의미
                {
                    isGroupWord = false;
                    break;
                }
                alpha[index] = true;
            }
            
        }
        if (isGroupWord)
        {
            ++cnt;
        }
    }
    cout << cnt;
    return 0;
}

모든 예제 코드의 소스파일은 제 개인 깃허브 레포지토리 에 있습니다.

 

Workspace/알고리듬 풀이 at main · cyphen156/Workspace

Studying . Contribute to cyphen156/Workspace development by creating an account on GitHub.

github.com

 

 

 

 

 

Extra : 2년 전 코드

왜 이런식으로 풀어놨을까? 고민해봤다.

비교했을 때

  1. 단어의 첫 문자 체크포인트를 생략한다.
  2. 단어의 마지막 문자는 for조건문 j < str.length()에 의해 생략된다 -> 배열 인덱스를 넘어가는 연산을 하지 않는다.

그룹 단어 체커_1316_Legacy.c

#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>

int main(void) {
    int len, cnt = 0;
    scanf("%d", &len);

    for (int i = 0; i < len; i++) {
        char s[101] = { 0 };
        int alpha[26] = { 0 };
        scanf("%s", s);

        for (int j = 0; s[j] != '\0'; j++) {
            if (alpha[s[j] - 'a'] == 0) {
                alpha[s[j] - 'a'] = 1;
            }
            else if (alpha[s[j] - 'a'] == 1 && s[j] != s[j - 1]) {
                alpha[s[j] - 'a'] = -1;
            }
        }

        cnt++;
        for (int j = 0; j < 26; j++) {
            if (alpha[j] == -1) {
                cnt--;
                break;
            }
        }
    }
    printf("%d", cnt);
    return 0;
}