기능 정의
처음에는 단순히 “오답 코드를 고쳐주는 AI"를 만들고자 했으나, 실제 사용 가능한 데이터와 사람이 오류를 해결하는 사고 과정을 반영하면서 기능의 입력, 출력, 그리고 사용자 피드백 방식이 점차 구체화되었다.
결과적으로 기능은 다음과 같이 정의되었다:
문제 설명, 오답 코드, 실패한 테스트 케이스를 입력으로 받아,
AI가 논리 오류를 수정한 코드를 생성하고,
수정 전후 코드의 차이(diff)와 틀린 이유를 시각적으로 제공한다.
문제 인식
온라인 저지 환경에서 알고리즘 문제를 풀면 여러 종류의 오류가 발생한다. 대표적인 유형은 다음과 같다:
- 컴파일 오류: 문법 오류
- 런타임 오류: 실행 중 예외 (예: ZeroDivision, IndexError)
- 시간/메모리 초과: 비효율적인 알고리즘
- 출력 불일치: 정답과 다른 결과 → 논리 오류
이 중 논리 오류는 초보자에게 특히 어렵다.
- 시스템이 오류 위치나 원인을 알려주지 않는다.
- 결과는 틀렸지만, 왜 틀렸는지는 직접 찾아야 한다.
- 코드뿐 아니라 문제 조건과 제한 사항에 대한 이해도 필요하다.
초기 아이디어
처음에는 기능을 단순하게 구상했다.
“오답 코드를 넣으면 AI가 알아서 고쳐주는 것.”
정답을 생성해주는 기능 정도로 막연하게 생각했다. 그러나 막상 구체화하려고 하자 몇 가지 문제가 드러났다:
- 무엇을 입력으로 줄 것인가?
- 정답을 보여주는 것만으로 사용자가 무엇을 배울 수 있을까?
- 어떤 방식으로 잘못된 부분을 식별하고 전달할 것인가?
결국 기능을 실제로 구현 가능하고 유의미하게 만들기 위해서는 입출력 구조부터 다시 설계해야 했다.
데이터
온라인 저지 시스템이라는 특성상, AI 학습이나 추론에 유용한 데이터가 자연스럽게 축적된다.
다음과 같은 항목들을 시스템에서 확보할 수 있다:
데이터 항목 | 설명 |
---|---|
문제 설명 | 자연어로 된 알고리즘 문제 명세 |
오답 코드 | 제출된 오답 코드 |
오답 사유 | 컴파일 오류 / 런타임 오류 / 시간 초과 / 논리 오류 등 |
실패한 테스트 케이스 | 입력값, 오답 출력, 기대 출력 |
정답 코드 | 동일 문제에 대한 정답 제출 코드 또는 수정된 코드 |
이 데이터를 바탕으로 기능 설계를 이어나갈 수 있었다.
경험 기반
실제 현장에서, 초보자의 논리 오류를 수정해주는 과정을 그대로 기능으로 옮기는 것이 설계의 출발점이 되었다. 내가 학원에서 학생들을 도울 때 주로 다음과 같은 흐름으로 문제를 해결했다:
문제와 코드 함께 검토
문제 설명과 제한 조건, 오답 코드를 동시에 읽는다. 단순히 코드만 보고 판단하면 중요한 정보를 놓치기 쉽다.테스트 케이스 확인
실패한 테스트 케이스를 직접 실행하여 어떤 상황에서 잘못된 결과가 나오는지 확인한다.오류 원인 설명 및 수정
문제의 위치를 파악한 뒤, 어떤 부분이 잘못되었는지 설명하고 수정 방향을 안내한다.
이 과정을 시스템화하면 AI 모델이 어떤 정보를 입력받고 어떤 출력을 내야 할지가 비교적 명확해진다.
입출력
이전 과정을 정리해 다음과 같은 형태의 기능 구조를 도출했다.
입력값
- 알고리즘 문제 설명
- 오답 코드
- 실패한 테스트 케이스 (입력, 오답 출력, 기대 출력)
출력값
- 논리 오류가 수정된 코드
- 틀린 이유에 대한 설명 (예: 반복 조건 오류, 잘못된 초기화 등)
부가 피드백
- 오답 코드와 수정 코드의 diff 시각화
- 수정된 코드에 주석 또는 하이라이트 추가
- 틀린 이유를 요약한 텍스트 출력
단순히 정답 코드를 생성하는 데서 멈추는 것이 아니라, 사용자가 무엇이 문제였고 어떻게 바뀌었는지를 직접 확인하고 이해할 수 있도록 구성했다.
기능 정의
이 과정을 바탕으로 기능을 다음과 같이 정의했다.
알고리즘 문제 설명, 오답 코드, 실패한 테스트 케이스를 입력으로 받아,
AI를 통해 논리 오류를 수정한 코드와 틀린 이유에 대한 설명을 생성하고,
수정 전후 코드의 차이(diff)와 틀린 이유를 시각적으로 제공한다.
회고
기능은 처음엔 막연했지만, 실제 데이터를 검토하고
사람이 오류를 고치는 과정을 반영하면서
구체적인 입출력 구조와 사용자 피드백 방식까지 정의할 수 있었다.