본문 바로가기

백준 문제

(C#) AI와의 대결 : 백준 알고리즘 1152번 Chat-GPT와 코드 비교

반응형

나는 지금 solved.ac 홈페이지에서 class1 알고리즘을 모두 푼 상태이다.

알고리즘을 풀고 게시글을 쓰는 기준은 내가 많이 틀리고 다른 사람들도 많이 틀린 글 위주로 쓸 것이다.

지금은 브론즈 단계라 쓸게 많이 없지만 나중가면 거의 매일써야 할지도 모르겠다.

이번에는 내가 입력으로 주어진 조건에 대해 제대로 숙지하지 못해서 틀린 경우라 내 코드와 챗 지피티에게 코드를 작성하라 하고 코드를 비교해보겠다.


백준 1152번 문제

문제 : 영어 대소문자와 공백으로 이루어진 문자열이 주어진다. 이 문자열에는 몇 개의 단어가 있을까? 이를 구하는 프로그램을 작성하시오. 단, 한 단어가 여러 번 등장하면 등장한 횟수만큼 모두 세어야 한다.

 

입력 : 첫 줄에 영어 대소문자와 공백으로 이루어진 문자열이 주어진다. 이 문자열의 길이는 1,000,000을 넘지 않는다. 단어는 공백 한 개로 구분되며, 공백이 연속해서 나오는 경우는 없다. 또한 문자열은 공백으로 시작하거나 끝날 수 있다.

 

출력 : 첫째 줄에 단어의 개수를 출력한다.

문제풀이

처음에는 간단하게 입력 되는 문자열을 띄어쓰기로 구분해서 나누고 나눠진 개수를 세면 된다고 생각했다.

그래서 아래 처럼 코드를 작성했다.

 

#첫번째 시도

using System;

namespace test
{
    class MainApp
    {
        static void Main(string[] args)
        {
            string[] word = Console.ReadLine().Split(" ");
            Console.WriteLine(word.Length);
        }
    }
}

엄청 간단한 코드다. 결과는 틀렸다고 나왔다. 왜 그런지 입력 조건을 찾아보았을때 "문자열은 공백으로 시작하거나 끝날 수 있다."라는 조건을 알게 되었고 문자열의 앞뒤에 공백이 있을때 카운트를 제거 하는 코드를 작성했다.

 

#두번째 시도

using System;
namespace test
{
    class MainApp
    {
        static void Main(string[] args)
        {

            string[] word = Console.ReadLine().Split(' ');
            int empty = 0;
            empty += (word[0] == "" ? 1 : 0 );
            empty += (word[word.Length - 1] == "" ? 1 : 0);
            Console.WriteLine(word.Length - empty);
        }
    }
}

결과는 성공이였고 과연 chat-GPT는 어떻게 코드를 작성할지 같이 알아보자.


Chat-GPT에게 물어본 문장

시간제한이 2초이고 메모리제한이 128MB일때
위에서 설명한 [문제,입력,출력]

추가적으로 아래 코드는 내가 작성한 코드야.
너가 작성한 코드설명과 내가 작성한 코드를 모두 보여주며 비교해서 블로그 글을 작성해줘

(나의 코드)


다음은 문제 설명에 지정된 시간 및 메모리 제약 조건을 충족해야 하는 C#의 예제 솔루션입니다.

해결책 1:

using System;

class Program
{
    static void Main(string[] args)
    {
        string input = Console.ReadLine().Trim(); // read input and remove leading/trailing spaces
        int count = 0;

        if (input.Length > 0) // check if input is not empty
        {
            count = 1; // count the first word
            for (int i = 0; i < input.Length; i++)
            {
                if (input[i] == ' ') // check for space character
                {
                    count++; // increment count for each space found
                }
            }
        }

        Console.WriteLine(count);
    }
}

이 솔루션에서는 'Console.ReadLine()'을 사용하여 입력 문자열을 읽고 'Trim()' 메서드를 사용하여 선행 또는 후행 공백을 제거합니다. 개수는 다음으로 초기화됩니다.

 

다음은 귀하가 작성한 솔루션과 이전에 제공한 솔루션을 비교한 것입니다.

 

해결책 2:

using System;

namespace test
{
    class MainApp
    {
        static void Main(string[] args)
        {

            string[] word = Console.ReadLine().Split(' ');
            int empty = 0;
            empty += (word[0] == "" ? 1 : 0 );
            empty += (word[word.Length - 1] == "" ? 1 : 0);
            Console.WriteLine(word.Length - empty);
        }
    }
}

두 솔루션 모두 공백을 기준으로 분할하여 입력 문자열의 단어 수를 세는 것을 목표로 합니다. 솔루션 1은 'for' 루프를 사용하여 입력 문자열을 반복하고 공백 수를 계산합니다. 솔루션 2는 Split 방법을 사용하여 입력 문자열을 단어 배열로 분할한 다음 배열의 시작 또는 끝에서 빈 단어 수를 계산합니다.

시간 및 메모리 효율성 측면에서 두 솔루션 모두 문제 설명에 지정된 요구 사항을 충족해야 합니다. 그러나 솔루션 2는 솔루션 1보다 약간 더 짧고 간결하며 동일한 결과를 얻기 위해 더 적은 수의 코드를 사용합니다.

또한 솔루션 2는 삼항 연산자를 사용하여 빈 단어 수를 증가시켜 코드를 더 간결하고 읽기 쉽게 만듭니다. 하지만 삼항 연산자에 익숙하지 않은 초보자에게는 이해하기 쉽지 않을 수 있습니다.

전반적으로 두 솔루션 모두 문자열에서 단어를 세는 문제를 해결하는 데 유효하고 효율적이지만 솔루션 2는 코드가 더 짧고 간결하기 때문에 더 적합할 수 있습니다.


챗 지피티에서는 나의 코드가 더 짧고 간결하기때문에 더 적합하다고 말을 해주었지만, chat-GPT가 쓴 코드중 if(input.Lengh >0)이라는 조건이 있을때 카운트를 세는 것을 보고 내 코드에는 아무것도 입력되지 않았을때 처리를 따로 해주지 않았다는 것을 깨달았다. 그래서 실제로 내 코드에 아무것도 입력하지 않으니 아래처럼 -1이라는 값을 출력했다.

백준 문제 1152번을 통과를 했지만 백준 문제를 제출할때 다양한 테스트 케이스가 없다보니 내 코드처럼 불완전한 코드가 있어도 통과가 되는 경우가 있나보다. 프로그램을 고치고 싶지만 오늘 시간이 따로 나지 않아서 시간이 나면 고쳐서 게시글을 올려야 겠다. 반면에 챗지피티가 작성한 코드는 내 코드와 같은 오류가뜨지 않는다. 챗지피티는 자체적으로 코드를 작성하고 예외처리까지 반영되어 적용된 코드를 작성하는데 나보다 적은 시간안에 완벽한 코드를 작성하는것을 보니, 확실히 개발자에게 챗지피티는 유용한 도구가 될것이다.

반응형