ChatGPT로 알고리즘 문제 프리패스하기

"New Overwatch hero Arcane Ashe an American gunslinger" - Midjourney and ChatGPT

발단

최근에 ChatGPT와 관련된 글들이 뉴스와 트위터 등에서 많이 보이고 있어서 무료기도 해서 직접 채팅을 해보았습니다. 처음에는 어떤 질문을 해야할지 몰라서 간단한 대화 정도만 하다가 최근에는 생각보다 괜찮아서 모르는 용어가 있을 때 구글 대신 ChatGPT에 먼저 물어보는 편입니다. 구글은 여러 게시물들을 사용자가 직접 방문하면서 내가 원하는 답이 있는지 찾는 반면, ChatGPT는 마치 전문가에게 직접 물어보는 것처럼 맞춤형 답변을 해주기 때문에 제가 원하는 대답일 확률이 높은 것 같기도 합니다. (물론 오답을 그럴듯하게 답변하기도 합니다)

※ ChatGPT 웹사이트 링크 : https://openai.com/blog/chatgpt/

그러던 중 최근에 백준, 알고스팟, 프로그래머스 등의 웹사이트에서 알고리즘 문제를 풀다가 문득 ChatGPT에게 알고리즘 문제를 제시하면서 문제를 풀기 위한 코드를 작성해준다면 얼마나 정확하게 작성해줄지 궁금해졌습니다. 그래서 간단하게 테스트 해보기로 했습니다.

전개

먼저, 알고리즘 문제 출제 사이트를 정해야 했는데 최근에 풀었던 곳인 프로그래머스를 사용해보기로 했습니다. 그리고 ChatGPT에게 그림이 아닌 오직 텍스트로만 내용을 전달해야 했기 때문에 그림 설명이 없는 문제들을 찾아보았습니다. 그 중에서 난이도가 쉬우면서 정답률이 47% 정도 되는 (적당히 도전의식이 생기는?) "숫자 짝꿍" 이라는 문제를 발견했습니다.

"숫자 짝꿍" 문제 설명도 2 문단으로 짧고, 그림도 없고, 제한사항도 3개 정도로 적당해보였습니다. 그래서 저는 이 문제를 ChatGPT에게 풀도록 명령을 해보기로 하였습니다.

※ "숫자 짝꿍" 문제 링크: https://school.programmers.co.kr/learn/courses/30/lessons/131128

ChatGPT는 한국어로도 가능하지만, 영어가 더 빠르고 좋은 성능을 낸다고 들었기에, 한국어 문제를 번역기를 통해 영어로 번역한 후 아래와 같이 명령을 내렸습니다.

generate JavaScript code to solve below algorithm problem:

problem description
The largest integer that can be created using the integers k (0 ≤ k ≤ 9) that appear in common at any position of the two integers X and Y is called a pair of two numbers (provided that among integers that appear in common, numbers only). If X and Y don't have a pair, the pair is -1. If the pair of X and Y consists only of zeros, then the pair is zero.

For example, if X = 3403 and Y = 13203, then the pair of X and Y is 330, which is the largest integer that can be made from 3, 0, and 3 common to X and Y. As another example, if X = 5525 and Y = 1255, the pair of X and Y is 552, which is the largest integer that can be formed from the 2, 5, and 5 common to X and Y (X has three 5's and Y has 5's). 2 will appear, so one extra 5 cannot be paired.)
Complete a solution function that returns the pair of X and Y given two integers X and Y.

Restrictions
3 ≤ X, the length (number of digits) of Y ≤ 3,000,000.
X and Y do not start with 0.
The pair of X and Y can be quite large integers, so we return them as strings.

그러자, ChatGPT는 JavaScript 소스 코드를 제공합니다.

이와 더불어 작성한 소스코드에 대한 설명 및 예시를 돌렸을 때 어떤 값들이 나오는지도 샘플로 전달합니다.

그리고 저는 ChatGPT가 작성한 소스코드를 그대로 복사 및 붙여넣기 후 제출해보았습니다.

총 5 개의 테스트 항목 중 테스트 4 항목이 실패하였네요. 결과값과 기대값이 다르다고 합니다.

저는 프로그래머스에서 알려준 결과값과 기대값을 ChatGPT에게 보고합니다.

나: 만약 입력 X가 "12321"이고 Y가 "42531"일 때 리턴 값이 "321"이어야 돼. (그렇게 되도록) 너의 소스 코드를 수정해주렴.

ChatGPT는 제가 명령한 내용을 받아 자신의 코드를 교정하여 다시 제출합니다.

ChatGPT: 입력 X="12321"이고 Y="42531"일 때 "321"을 리턴하기 위해 다음과 같이 수정할 수 있겠네요.

그리고 마지막에 테스트한 결과까지 친절하게 알려줍니다. 추가로, 아래와 같은 코멘트를 남겨주었습니다.

결과를 반환하기 전에 내림차순으로 정렬하는 단계를 추가했습니다. 이렇게 하면 일반 숫자를 사용하여 만들 수 있는 가장 큰 정수가 반환됩니다.
이게 도움이 되길 바래요! 궁금한 점이 있으면 알려주세요.

그리고 저는 ChatGPT의 개선된 소스 코드를 복사 및 붙여넣기하여 다시 제출을 해봅니다. <코드 실행> 후 5개의 테스트를 모두 통과하였습니다 ^^.

(하단의 이모티콘에게 왠지 미안해집니다... (~˘▾˘)~ )

위기

프로그래머스는 <코드 실행>과 <제출 후 채점하기> 기능이 나뉘는데, <코드 실행>은 제출로 간주하지 않고 예시로 주어지는 5가지 입력에 대해 정상 작동을 검증합니다. <코드 실행>이 모두 통과하면 <제출 후 채점하기>를 통해 보이지 않는 입력 샘플에 대한 테스트를 수행합니다.

ChatGPT가 작성한 소스 코드를 복사 및 붙여넣기 후 <제출 후 채점하기>를 실행한 결과, 또 다른 문제에 직면하였습니다.

바로, 테스트 11부터 테스트 15 까지 발생한 시간 초과로 인한 실패입니다. 즉, ChatGPT가 작성한 코드는 정답을 출력하지만, 계산 시간이 오래 걸린다는 한계가 있었던 것으로 보입니다.

혹시나 기존에 작성한 코드에 최적화도 가능한지 반반의 확률로 다시 명령을 내려보았습니다.

나: 너의 코드는 정답이지만, 계산 시간이 너무 오래걸려. 코드의 계산 시간을 최적화 해 줄 수 있니?

위와 같이 입력하자마자 ChatGPT는 망설임없이 바로 최적화된 코드를 건네줍니다..

ChatGPT: 여기 더 나은 시간 복잡도를 가져야 하는 최적화된 버전의 함수입니다.

이 버전에서는 카운트 배열을 사용하여 각 숫자의 빈도를 X에 저장합니다. 그 다음 Y의 문자를 반복하여 배열의 해당 카운트가 0보다 큰 경우 결과에 추가합니다. 이를 통해 큰 입력에 비용이 많이 들 수 있는 indexOf() 및 replace() 호출을 피합니다.

ChatGPT는 위와 같이 추가적인 설명을 덧붙였으나, 저는 처음부터 지금까지 문제를 읽지도 않았기에 설명을 읽지는 않았습니다.

절정

이제 최적화까지 진행된 ChatGPT의 코드를 복사 및 붙여넣기 했을 때 과연 테스트를 모두 통과할지 궁금해집니다.

아래는 제출한 코드의 테스트 결과입니다.

ALL 통과
정답입니다! ChatGPT!

결국 ChatGPT가 작성한 코드가 모든 테스트를 통과하여 문제를 풀었습니다.

ChatGPT에게 박수를...

결말

현재 우리는 AI에게 명령만 내리면 알고리즘을 문제를 풀어주는 세상에 살고있습니다. 위에서 사용한 알고리즘 문제 "숫자 짝꿍"은 응시자 중 절반도 풀지 못한 마냥 쉽지는 않은 문제입니다.

그런데, ChatGPT는 그걸 스스로 짜고, 개선하고, 최적화까지 해서 단번에 풀어버렸습니다. 제가 명령을 내리는 시간을 제외하고 순수하게 ChatGPT가 계산하는 시간만 놓고 보면 체감상 5초도 걸리지 않은 것 같습니다.

만약 실제 코딩 테스트를 온라인으로 진행한다고 할 때 저와 같이 ChatGPT에게 명령을 내리는 방법으로 문제를 풀 수 있다면 수험생들은 어떨까요?

집에서 코딩 테스트 중인 수험생

그렇게 문제풀이 변별력이 떨어져 버린다면, 프로그래머스와 같은 알고리즘 문제 풀이 사이트는 어떻게 될까요?

나중에 알게된 프로그래머스 관계자

저도 알고리즘 문제 1개만 놓고 진행한 실험이기에 놓친 부분이 있을 수는 있겠으나, 이렇게 된다면 최악의 경우 코딩테스트가 무력화될 수도 있을 것 같습니다. 이를 보완하기 위한 수단으로는 오프라인 코딩 테스트가 진행될 가능성도 있겠네요.

해당 부분에 대한 알고리즘 문제 풀이 사이트들 및 온라인 코딩테스트를 진행 중인 구인 회사들이 어떻게 대응할지 궁금해집니다.

p.s.

ChatGPT 덕분에 문제를 풀게되어 감사 인사를 전해주었습니다.

나:&nbsp;소스 코드를 제공해줘서 고마워! 너 덕분에 문제를 맞혔어! 너 덕분에 코딩 테스트에 합격할 것 같아!
ChatGPT: 천만에요! 문제 해결에 도움이 되었다니 기쁩니다. 솔루션이 코딩 테스트를 통과하는 데 도움이 될 수 있어서 기쁩니다. 추가 질문이 있거나 추가 도움이 필요하면 주저하지 말고 문의해주세요. 코딩 공부에 행운을 빌게요!