본문 바로가기

백준 문제

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

반응형

전에 게시한 게시물과 같이 이번에도 많이 틀린 문제를 가져왔다. 

이번에는 C#언어 뿐아니라 전체 언어를 다루는 사람들도 당황스러워 했던 문제 같다.

정답률은 35퍼밖에 되지 않는다. 나는 이미 풀었지만 내가 정확한 입력값을 준다면 Chat-GPT는 정확한 출력값을 내는지 확인해보자.


백준 10951번 문제

문제 : 두 정수 A와 B를 입력받은 다음, A+B를 출력하는 프로그램을 작성하시오.

입력 :  입력은 여러 개의 테스트 케이스로 이루어져 있다.

            각 테스트 케이스는 한 줄로 이루어져 있으며, 각 줄에 A와 B가 주어진다. (0 < A, B < 10)

출력 :  각 테스트 케이스마다 A+B를 출력한다.

문제풀이

사실 문제자체가 애매하게 나왔다. 입력이 여러개의 테스트 케이스로 이루어져 있다고만 말을 하고 몇개인지 말을 해주지 않았기 때문에 나는 무한 반복하는 코드를 작성했다.

while (true)
{
    String[] num = Console.ReadLine().Split();
    Console.WriteLine(Int32.Parse(num[0]) + Int32.Parse(num[1]));
}

당연히 결과는 런타임 에러가 나왔다. 왜 그런지 질문게시판을 보니 EOF에 대해 알아보라고 사람들이 설명해주었다. EOF란 파일의 끝이 지났는지 확인하는 것이다. 파일의 끝이 지났는지 확인한다? 뭔 소린지 모르겠지만 데이터가 없음을 의미 한다는 것이라고 위키백과에서 설명해주었다.

 

https://ko.wikipedia.org/wiki/%ED%8C%8C%EC%9D%BC_%EB%81%9D

 

파일 끝 - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전. 컴퓨팅에서, 파일 끝(End of File, EOF[1])는 데이터 소스로부터 더 이상 읽을 수 있는 데이터가 없음을 나타낸다. C 표준 라이브러리에서 getchar와 같은 문자 입력 함

ko.wikipedia.org

 

데이터가 없음은 NULL이므로 NULL을 받았을때 프로그램을 끝내는 코드를 작성해보았다.

while (true)
{
    String[] num = Console.ReadLine().Split();
    if (num[0] == null) break;
    Console.WriteLine(Int32.Parse(num[0]) + Int32.Parse(num[1]));
}

이 코드도 런타임 에러가 나온다. 그 이유를 찾아보니 num에 null이 들어가면 num[0]에 접근할 수없기 때문이다. 따라서 코드를 아래와 같이 고치니 정답이 되었다. 그럼 한번 챗지피티한테 코딩을 시켜보자.

while (true)
{
    String num = Console.ReadLine();
    if (num == null) break;
    String[] arr = num.Split();
    Console.WriteLine(Int32.Parse(arr[0]) + Int32.Parse(arr[1]));
}

Chat-GPT에게 물어본 문장

시간제한이 1초이고 메모리제한이 256MB일때 
문제 : 두 정수 A와 B를 입력받은 다음, A+B를 출력하는 프로그램을 작성하시오.
입력 :  입력은 여러 개의 테스트 케이스로 이루어져 있다.
            각 테스트 케이스는 한 줄로 이루어져 있으며, 각 줄에 A와 B가 주어진다. (0 < A, B < 10)
출력 :  각 테스트 케이스마다 A+B를 출력한다.
위 조건을 가지고 문제를 풀어줘 언어는 C#이야.


주어진 시간과 메모리 제한으로 주어진 문제를 해결하기 위해 다음 접근 방식을 사용할 수 있습니다.

먼저 while 루프를 사용하여 더 이상 읽을 입력이 없을 때까지 입력을 계속 읽을 수 있습니다. 그런 다음 각 입력에 대해 Split() 메서드를 사용하여 두 개의 정수로 분할하고 변수에 저장할 수 있습니다. 마지막으로 두 정수의 합을 출력할 수 있습니다.

성능을 최적화하기 위해 느릴 수 있는 Console.WriteLine() 메서드를 사용하는 대신 StringBuilder 클래스를 사용하여 출력 문자열을 연결할 수 있습니다.

주어진 조건으로 문제를 해결하는 C# 코드는 다음과 같습니다.

using System;
using System.Text;

namespace Test
{
    class Program
    {
        static void Main(string[] args)
        {
            StringBuilder sb = new StringBuilder();

            while (true)
            {
                string line = Console.ReadLine();
                if (line == null) break;

                string[] tokens = line.Split();
                int a = int.Parse(tokens[0]);
                int b = int.Parse(tokens[1]);
                int sum = a + b;
                sb.AppendLine(sum.ToString());
            }

            Console.Write(sb.ToString());
        }
    }
}

이 코드에서는 먼저 출력을 저장할 StringBuilder 개체 sb를 만듭니다. 그런 다음 읽을 입력이 더 이상 없을 때까지 while 루프를 사용하여 입력을 읽습니다. 각 입력에 대해 Split() 메서드를 사용하여 라인을 두 개의 정수로 분할하고 int.Parse() 메서드를 사용하여 구문 분석합니다. 그런 다음 두 정수의 합을 계산하고 AppendLine() 메서드를 사용하여 StringBuilder 개체에 추가합니다.


마지막으로 Console.Write() 메서드를 사용하여 StringBuilder 개체에 저장된 출력을 인쇄합니다. 이 접근 방식은 주어진 시간 및 메모리 제한 내에서 많은 수의 테스트 사례를 효율적으로 처리할 수 있습니다.


제출결과는 정답이다. 문제 파악능력이 나보다 뛰어날 뿐만아니라,  시간제한과 메모리제한을 엄수하기 위해 StringBuilder를 사용한다는게 인상깊었다. 내가 정확한 입력값을 주어 질문을 할때 정확한 출력으로 대답을  해주는게 마치 코드를 작성하는 것과 같은 기분이든다. 내가 아무리 열심히 개발 공부를 해도 코드 작성하는 것 자체는 AI를 이길 수없다고 생각이 된다. 단순 코드를 작성하는 것은 AI에게 맡기고 나는 추가적인 가치와 생산성을 만들어내야지 내가 이 직업을 유지 할 수 있게 될거라고 생각된다.

반응형