코딩테스트 (C#)

백준 1316 : 그룹 단어 체커

UniCoti-sub 2024. 12. 12.
반응형

문제 사진

이번 문제는 어떤 단어에서 문자가 연속되어 있는지 확인해야 하는 문제이다.

n개의 단어가 주고지고, 그 중 몇개가 그룹 단어인지 반환하면 된다.

그룹 단어란 문자가 연속된 단어를 말하는데, 예시를 보면 이해가 갈 것이다.

한 문자는 서로 모여있어야 한다.

 

로직은 생각을 조금 했는데 그룹 단어인지 판별은 못해도 아닌 것을 판별하기

쉬워 보였다. 2개를 연속으로 비교해서 다르면 이전에 나왔는지를 체크하는 방법이다.

2개를 연속으로 비교했는데 이전에 그 문자가 나오지 않았다면 그룹단어의 조건을 충족하고

 

그 문자가 나온적이 있다면 서로 떨어져 있으므로 조건을 충족하지 않는다.

이렇게 조건이 아닌 조건으로 탈락시켜서 성공을 가리면 좋을 것 같다.

 

using System;
using System.Linq;

namespace unicoti {
    class Program {
        static void Main(string[] args) {
            int.TryParse(Console.ReadLine() ?? "", out int cases);
            int num = 0;

            for (int i = 0; i < cases; i++) {
                string input = Console.ReadLine() ?? "";
                char[] arr = new char[input.Length];
                int index = 0;
                
                for (int j = 0; j < input.Length; j++) {
                    if (j != 0 && input[j] != input[j - 1]) {
                        if (arr.Contains(input[j])) {
                            break;
                        }
                    }
                    arr[index++] = input[j];
                    
                    if (j == input.Length-1) {
                    	num++;
                    }
                }

                
            }

            Console.WriteLine(num);
        }
    }
}

 

나는 이렇게 표현했다.

앞서 말한 로직과 같은 코드이다. 

변수를 많이 사용하지 않아 난해해 보일 수 있겠다만 앞서 설명한 그대로이다.

 

2번 이상 돌아갔을 때 연속으로 비교하여 앞서 나왔는지를 판단한다.

만약 연속되었다면 넘어가고, 연속되지 않으며 이전에 나온적이 있다면

break를 통해 for문을 넘겨버린다.

 

만약 끝까지 통과했으면 num을 증가시켜 개수를 추가한다.


오늘의 느낀점)

이번 문제는 고민을 조금 했다. 이제 점점 생각이 필요한 문제들이

나오고 있는데, 문제를 풀기 전에 휴대폰으로 미리 알고리즘을 구상해야겠다.

계속 이렇게 즉석에서 풀기엔 점점 힘들어지는 것 같다.

 

코드 기법에 대한 교훈으로는 index++을 사용해서 리스트에서 Append를 쓰듯

간편하게 표현한 점이다. 변수 하나가 추가되지만 나름 합리적인 방법같다.


이상으로 도움이 되었길 바라며,

 

끝.

반응형

댓글