본문 바로가기

백준 문제

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

반응형

이번에는 다소 당황스러운 문제를 가지고 왔다.

문제 난이도는 브론즈 5로 어려운 문제는 아닌데 C#언어를 다루는 사람입장에서는 다소 당황스러웠다.

전체 정답비율이 56퍼인데 반해 C#하는 사람들의 제출결과는 반타작도 되지 못한다. 왜 그런지 같이 살펴보자.


백준 2741번 문제

문제 : 자연수 N이 주어졌을 때, 1부터 N까지 한 줄에 하나씩 출력하는 프로그램을 작성하시오.

입력 : 첫째 줄에 100,000보다 작거나 같은 자연수 N이 주어진다.

출력 : 첫째 줄부터 N번째 줄 까지 차례대로 출력한다.

문제풀이

문제는 사실 반복문만 알고있으면 바로 풀수있는 정도의 문제이다.

 

밑의 코드로 작성해서 채점을 한 결과.. 계속 시간초과가 났다. 

int num = Int32.Parse(Console.ReadLine());
for (int i = 1; i <= num; i++) Console.WriteLine(i);

내가 IDE로 사용하는 Visual Studio에서는 이상없이 결과가 나오는데 백준 제출만하면 계속 오류가 뜬다.

그래서 chat-gpt에게 한번 풀어보라고 시켜봤다.


Chat-GPT에게 물어본 문장- [처음]

문제 : 자연수 N이 주어졌을 때, 1부터 N까지 한 줄에 하나씩 출력하는 프로그램을 작성하시오.
입력 : 첫째 줄에 100,000보다 작거나 같은 자연수 N이 주어진다.
출력 : 첫째 줄부터 N번째 줄 까지 차례대로 출력한다.
위 조건을 가지고 문제를 풀어줘 언어는 C#이야.


이 친구도 나와 비슷한 코드를 작성했다. 결과는 똑같이 시간초과가 나왔다. 

using System;

class MainApp {
  static void Main(string[] args) {
    int n = int.Parse(Console.ReadLine());
    for (int i = 1; i <= n; i++) {
      Console.WriteLine(i);
    }
  }
}

 백준에는 문제를 풀때 시간제한과 메모리 제한이 있다.

내가 이 두 정보를 입력값에 추가하지 않아서 시간이라는 변수를 생각하지 않고 코드를 작성한게 아닌가 생각된다.

따라서 추가적인 질문을 해보았다.


Chat-GPT에게 물어본 문장- [두번째]

다시 시간 초과가 나와 시간제한은 1초이고 메모리 제한은 128MB야. 다시 한번 문제를 풀어봐

 


결과는 정답이였다. 밑에서부턴 챗지피티의 답변이다. 

 

시간 초과를 피하고 메모리 제한 내에서 유지하기 위해 StringBuilder를 사용하여 출력을 연결한 다음 루프가 완료된 후 한 번에 모두 인쇄할 수 있습니다. 다음은 업데이트된 솔루션입니다.

 

using System;
using System.Text;

namespace NumberPrint
{
    class MainApp
    {
        static void Main(string[] args)
        {
            int n = int.Parse(Console.ReadLine());
            StringBuilder sb = new StringBuilder();
            
            for (int i = 1; i <= n; i++)
            {
                sb.AppendLine(i.ToString());
            }
            
            Console.Write(sb.ToString());
        }
    }
}

이 코드는 StringBuilder 개체를 초기화하여 출력을 저장한 다음 각 숫자를 루프 내에서 별도의 줄로 추가합니다. 마지막으로 연결된 전체 문자열은 Console.Write() 메서드를 사용하여 인쇄됩니다.

StringBuilder 개체를 사용하면 각 줄에 대해 새 문자열 개체를 만들지 않고도 많은 양의 텍스트를 효율적으로 저장하고 연결할 수 있습니다. 이를 통해 메모리 문제를 방지하고 성능을 개선하여 시간 초과를 방지할 수 있습니다.


실제로 백준 질문게시판에서도 StringBuilder 클래스를 사용하라고 제안을 해주고있다.

 

https://www.acmicpc.net/board/view/8888

 

글 읽기 - 시간초과 나는 이유를 모르겠습니다.

댓글을 작성하려면 로그인해야 합니다.

www.acmicpc.net

 

 StringBuilder에 대한 이해를 더 하기 위해 추가 질문을 해보았다.


Chat-GPT에게 물어본 문장- [세번째]

stringbuilder는 시간초과를 피하기 위한것이야 아니면 메모리 초과를 피하기 위한것이야?


예, 'StringBuilder'를 사용하면 경우에 따라 시간 초과 및 메모리 오버플로 문제를 방지하는 데 도움이 될 수 있습니다.

앞에서 언급한 많은 수의 라인을 출력해야 하는 문제의 경우 콘솔에 직접 쓰는 대신 StringBuilder를 사용하여 출력을 저장하면 시간과 메모리 사용량을 크게 줄일 수 있습니다.

이는 Console.WriteLine()을 반복적으로 사용할 때 이 메서드를 호출할 때마다 메모리 할당 및 I/O 작업 측면에서 오버헤드가 발생하기 때문입니다. 그러나 StringBuilder를 사용하면 출력을 단일 문자열 개체에 추가할 수 있으므로 메모리 할당 오버헤드를 줄이고 출력을 단일 작업으로 콘솔에 쓸 수 있습니다.

또한 큰 문자열을 처리하는 경우 StringBuilder를 사용하면 메모리 오버플로 문제를 방지할 수 있습니다. C#의 문자열은 변경할 수 없기 때문에 문자열에 대한 작업을 수행할 때마다 메모리에 새 문자열 개체가 생성되어 큰 문자열을 처리하는 경우 메모리 오버플로가 빠르게 발생할 수 있습니다. StringBuilder를 사용하면 새 문자열 개체를 만들지 않고도 문자열 개체를 내부에서 수정할 수 있으므로 메모리 오버플로 문제를 방지할 수 있습니다.

전반적으로 StringBuilder를 사용하는 것은 메모리 사용을 최적화하고 특정한 경우에 시간 초과 문제를 피하는 데 유용한 기술이 될 수 있습니다.


원래 내가 모르고있는 기술을 알기 위해서는 구글링을 했고 내 코드에 맞는 정확한 정보를 찾기 위해 계속 찾아보려고 1~2시간씩 구글링 하는게 일상이였다. 이번기회로 패러다임이 바뀌고있다라고 느꼈다.

사람들이 장난으로 개발자들은 구글링을 잘하는게 중요하다 라고 말을했던게 기억이나는데, 이제는 챗지 피티 같은 채팅모델에게 자신의 코드에 대해 질문하는 것이 훨씬더 효율적이고 당연한 환경이 될 것 같다.

반응형