본문 바로가기
C#/C# : Baekjoon

[백준] C# : 그룹 단어 체커(1316번)

by TODAYCODE 2021. 11. 12.
반응형

백준 단계별로 풀어보기 7단계 10번문제

 

1316번: 그룹 단어 체커

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

www.acmicpc.net

문제의 핵심

1. 문자가 연속되는 중이라는 것을 파악하는 방법

2. 연속된 문자가 어떤 것이었는지를 기억하는 방법

 


역시나 당장 처리할 수 있는 것들부터 처리하고 어려운 부분을 하나씩 해결하자.

 

1.

단어그룹을 출력해야하므로 정답으로 출력할 int형 변수가 하나 필요하므로 answer로 생성해준다.

몇번 테스트를 수행할 것인지를 입력받기 위해서 테스트케이스를 입력받는다.

int n = int.Parse(Console.ReadLine()):

이렇게 입력받으면 n번만큼 for문을 돌려서 과정을 반복해주면 된다.

 

2.

문자가 반복된 여부를 저장하기 위해서 bool형태의 배열을 알파벳 개수만큼의 index로 생성해준다.

그러면 이제 입력 문자열에서 문자를 하나씩 검사하면서

현재문자와 다음번 문자가 동일하다면 넘어가고,

문자가 다를 경우에는 현재 문자에 해당하는 인덱스를 true로 바꿔준다.

그러다가 나중에 등장한 문자가 이미 true바뀐 인덱스의 알파벳이 등장하면 그룹단어가 아닌것이고

끝까지 true인 상태를 마주치지 못한다면 그룹단어인 것이다.

 

3.

여기서 중요한 점은,

현재 문자와 다음번 문자를 비교해서 동일한지를 판단해야하기 때문에

지금 문자가 마지막 문자인경우 다음번 문자가 없기 때문에 예외가 발생하여 오류가 나타난다.

따라서, 현재문자가 마지막인지도 확인을 별도로 진행해주어야한다.

만약 마지막 문자가 아니고, 다음번 문자와 동일한 상태라면

반복문의 i값을 증가시키면서 continue로 넘겨주면 된다.

 

다소 이해가 안되는 부분이 있다면 아래의 정답코드를 천천히 살펴본뒤

본문을 다시 읽는다면 큰 어려움 없이 문제가 해결될 것이다.

 

정답 코드

using System;

class 그룹단어체커
{
    static bool[] check = new bool[26];
    static int answer = 0;
    static void Main()
    {
        int n = int.Parse(Console.ReadLine());
        for (int i = 0; i < n; i++)
        {
            string str = Console.ReadLine();
            Count(str);
            for (int j = 0; j < check.Length; j++)
            {
                check[j] = false;
            }
        }
        Console.WriteLine(answer);
    }

    static int Count(string str)
    {
        for (int i = 0; i < str.Length; i++)
        {
            if (check[(str[i] - 'a')])
            {
                return 0;
            }

            check[(str[i] - 'a')] = true;

            if ((i + 1) < str.Length)
            {
                while (str[i] == str[i + 1])
                {
                    i++;
                    if ((i + 1) < str.Length)
                    {
                        continue;
                    }
                    else
                    {
                        break;
                    }
                }
            }
        }
        return answer++;
    }
}

 

 

반응형

댓글