상세 컨텐츠

본문 제목

코딩 테스트 풀이를 개발자(사람)과 ChatGPT 인공지능으로 비교해 보았습니다.

AI-VR-AR

by 김일국 2023. 2. 4. 11:27

본문

### 우선, ChatGPT 인공지능이란? ChatGPT에 직접 물어 보았다.(아래)

- 위 내용을 좀더 풀어서 해석하면, 텍스트 문서 기반으로 생성된 자료를 딥러닝 프로세스로 사전 훈련(강화학습)해서 만든 답변을 출력하는 대화형 AI로서 서술형 답변 내용은 시간에 따라서 달라질 수 있고 논술형은 편향된 논조를 가질 수 있다. 단, 이 문서 아래의 소스코딩 변환과 같은 정형화된 자료는 동일한 답을 내는 경우가 많다.

 간단히 말한다면, 빅 데이터 통계자료에서 강화(Reinforcement)학습으로 시행착오(Trial and Error)를 통해 학습한 데이터를 답변으로 보여주는 방식 입니다. 즉, 인터넷상의 사람들의 답변 내용 중 더 많이 Error없이 시행한 답변 내용을 우선 순위로 보여 준다고 할 수 있습니다.

- 위 내용으로 기존 구글 검색에서 사용자가 상위에 노출된 검색(답변)을 찾아서 사용하는 방식 보다는 편리하게 답변을 찾아 준다는 장점이 보이지만, 정답에 확률적으로 가까운 것을 AI가 찾아준다는 의미이고, 정답이 아닐 수 있다는 것은 구글 검색과 동일 합니다.  아래에 개발자가 개발하는 방식과 챗GPT로 개발하는 방식을 비교하는 시나리오를 구현해 보았습니다. 개발자(사람)이 검증하고, 수정하는 부분이 필수로 필요하다는 것을 알 수 있습니다.

 

### 먼저 개발자(사람)이 일반적인 프로그램 개발 순서대로 코딩을 해 본다. 우선 코딩 테스트 https://devth.goorm.io/ 에서  [응시환경 체험하기] 첫번째 문제인 '난이도별 문제 배열에서 3개 선정하기'를 순서도(FlowChart)로 구현한다.(아래 구글 드라이브에서

제공회사: https://www.draw.io 의 draw.io Diagram을 이용하여 웹 브라우저에서 플로우차트를 작성 한 예 클릭하면 소스확인가능)

 

 

### 위 순서도를 보고 구름 코딩 테스트인 https://devth.goorm.io/  [응시환경체험하기]에서 첫 번째 문제인 [문제 선정하기] 프로그램으로 입력한 문제의 난이도를 평가하는 코드를 작성한다.(소스코드는 아래 이미지 밑에 있다.)

### 위 플로우챠트를 보고 개발자가 직접 작성한 소스 코드(아래)

const readline = require("readline");
const rl = readline.createInterface({
	input: process.stdin,
	output: process.stdout
});
let N;
let questions = [];
rl.on("line", function(N) {
	N = parseInt(N);
	rl.on("line", function(questions) {
    	//매개변수 questions문자열을 split함수로 배열로 만들면서 map 반복함수로 배열값을 push 추가할 수 있다(아래)
		questions = questions.split(' ').map(function(el) {return parseInt(el);});
		if(questions.length == N){
			//JavaScript의 array 타입에는 기본적으로 sort() 라는 함수가 있어서 자동으로 정렬할 때 편하다.
			//근데 이게 비교함수를 지정하지 않고 기본 sort()만 호출했을 때는 문자열 비교를 한다.
			//숫자정렬을 하려면 비교함수를 지정해줘야 한다.(아래 a-b 는 오름차순, b-a 는 내림차순으로 정렬된다.)
			questions.sort(function(a, b){ return a-b; });//문제 난이도 정렬
			//console.log(questions);
			let count = 0;//앞(before) , 뒤(question) 문제의 난이도가 틀린 개수
			let before = questions[0];//초기 이전 문제 난이도, current는 현재문제 난이도
			//console.log(questions);
			for(let current in questions) {
				//console.log(current); questions배열의 index값을 가져온다.
				if(before != questions[current] && before < questions[current]) {
					count++;
				}
				if (count == 2) {
					break;
				}
				before = questions[current];//현재 난이도가 이전 난이도로 자리 이동
			}//forEach문(향상된 for문) 끝
			if(count < 2) {
				console.log("NO");
			}else{
				console.log("YES");
			}
			rl.close();
		}else{
			console.log('문제개수와 입력개수가 맞지 않습니다. 다시 시도해 주세요');
			console.log(questions);
			//N = 0; //처음부터 시도 할 때
			questions = []; //입력값만 다시 입력 할 때
		}
	});
});

//======================================================================================
//위 소스를 개선한 자바스크립트 소스 입니다.(아래-readline 입력객체 r1.on사용을 1개로 조정)
const readline = require("readline");
const rl = readline.createInterface({
	input: process.stdin,
	output: process.stdout
});
let N;
let questions = [];
rl.on("line", function(line) {
	questions.push(line);
	N = parseInt(questions[0]);//비교할 숫자의 개수
	if(typeof questions[1] == 'string') {
    	//매개변수 questions문자열을 split함수로 배열로 만들면서 map 반복함수로 배열값을 push 추가할 수 있다(아래)
		questions = questions[1].split(' ').map(function(el) {return parseInt(el);});
		if(questions.length == N){
			//JavaScript의 array 타입에는 기본적으로 sort() 라는 함수가 있어서 자동으로 정렬할 때 편하다.
			//근데 이게 비교함수를 지정하지 않고 기본 sort()만 호출했을 때는 문자열 비교를 한다.
			//숫자정렬을 하려면 비교함수를 지정해줘야 한다.(아래 a-b 는 오름차순, b-a 는 내림차순으로 정렬된다.)
			questions.sort(function(a, b){ return a-b; });//문제 난이도 정렬
			//console.log(questions);
			let count = 0;//앞(before) , 뒤(question) 문제의 난이도가 틀린 개수
			let before = questions[0];//초기 이전 문제 난이도, current는 현재문제 난이도
			//console.log(questions);
			for(let current in questions) {
				//console.log(current); questions배열의 index값을 가져온다.
				if(before != questions[current] && before < questions[current]) {
					count++;
				}
				if (count == 2) {
					break;
				}
				before = questions[current];//현재 난이도가 이전 난이도로 자리 이동
			}//forEach문(향상된 for문) 끝
			if(count < 2) {
				console.log("NO");
			}else{
				console.log("YES");
			}
			rl.close();
		}else{
			console.log('문제개수와 입력개수가 맞지 않습니다. 다시 시도해 주세요');
			console.log(questions);
			N = 0; //처음부터 시도 할 때
			questions = []; //입력값만 다시 입력 할 때
		}
	}
});

### 인공지능 ChatGPT로 실습순서:  사이트URL https://chat.openai.com/

- 문제 구문을 직접 질의해 본다.(아래)

- ChatGPT 인공지능의 답변은 완벽하진 않지만, 핵심 코드인 함수는 제대로 동작합니다.(아래 답변 javascript 코드)

- 위 ChatGPT 인공지능의 답변 코드인 selectQuestions() 함수를 사용하면, 정답을 구현 할 수 있습니다.(아래는 인공지능 코드)

// Run by Node.js 챗GPT 인공지능이 만든 selectQuestions() 함수 코드

const readline = require("readline");
const rl = readline.createInterface({
	input: process.stdin,
	output: process.stdout
});
function selectQuestions(difficulties) {
		difficulties.sort((a, b) => a - b);
		for (let i = 0; i < difficulties.length - 2; i++) {
			if (difficulties[i] < difficulties[i + 1] && difficulties[i + 1] < difficulties[i + 2]) {
				return [difficulties[i], difficulties[i + 1], difficulties[i + 2]];
			}
		}
		return [];
	}
let N;
let questions = [];
rl.on("line", function(N) {
	N = parseInt(N);
	rl.on("line", function(questions) {
		questions = questions.split(" ").map(num => parseInt(num));
		if(questions.length == N){
			if(selectQuestions(questions).length>2) { //위 ChatGPT가 만든 함수를 사용
				console.log("YES");
			}else{
				console.log("NO");
			}
			rl.close();
		}else{
			console.log('문제개수와 입력개수가 맞지 않습니다. 다시 시도해 주세요');
			console.log(questions);
			//N = 0; //처음부터 시도 할 때
			questions = []; //입력값만 다시 입력 할 때
		}
	});
}).on("close", function() {
	process.exit();
});

//=====================================================================================
//위 소스를 개선한 자바스크립트 소스 입니다.(아래-readline 입력객체 r1.on사용을 1개로 조정)
// Run by Node.js 챗GPT 인공지능이 만든 selectQuestions() 함수 코드

const readline = require("readline");
const rl = readline.createInterface({
	input: process.stdin,
	output: process.stdout
});
function selectQuestions(difficulties) {
		difficulties.sort((a, b) => a - b);
		for (let i = 0; i < difficulties.length - 2; i++) {
			if (difficulties[i] < difficulties[i + 1] && difficulties[i + 1] < difficulties[i + 2]) {
				return [difficulties[i], difficulties[i + 1], difficulties[i + 2]];
			}
		}
		return [];
	}
let N;
let questions = [];
rl.on("line", function(line) {
	questions.push(line);
	N = parseInt(questions[0]);//비교할 숫자의 개수
	if(typeof questions[1] == 'string') {
	    //매개변수 questions문자열을 split함수로 배열로 만들면서 map 반복함수로 배열값을 자동으로 추가(push)할 수 있다(아래)
		questions = questions[1].split(" ").map(num => parseInt(num));
		if(questions.length == N){
			rl.close();
		}else{
			console.log('문제개수와 입력개수가 맞지 않습니다. 다시 시도해 주세요');
			console.log(questions);
			N = 0; //처음부터 시도 할 때
			questions = []; //입력값만 다시 입력 할 때
		}
	}
}).on("close", function() {
	if(selectQuestions(questions).length>2) {
		//console.log(selectQuestions(questions));
		console.log("YES");
	}else{
		//console.log(selectQuestions(questions));
		console.log("NO");
	}
	process.exit();
});

- 위 ChatGPT소스와 개발자(사람)이 순서도를 보고 구현한 소스(selectQuestions함수)를 비교해 본다.(아래는 개발자인 사람 코드)

// Run by Node.js 개발자가 만든 selectQuestions() 함수 코드

const readline = require("readline");
const rl = readline.createInterface({
	input: process.stdin,
	output: process.stdout
});
function selectQuestions(questions) {
		questions.sort(function(a, b){ return a-b; });//문제 난이도 정렬
		let count = 0;//앞(before) , 뒤(question) 문제의 난이도가 틀린 개수
		let before = questions[0];//초기 이전 문제 난이도, current는 현재문제 난이도
		let answer = [before];//응답 배열 변수를 추가해서 ChatGPT 코드와 비슷하게 처리
		for(let current in questions) {
			//console.log(current); questions배열의 index값을 가져온다.
			if(before != questions[current] && before < questions[current]) {
				count++;
				answer.push(questions[current]);
			}
			if (count == 2) {
				break;
			}
			before = questions[current];//현재 난이도가 이전 난이도로 자리 이동
		}//forEach문(향상된 for문) 끝
		return answer;
	}
let N;
let questions = [];
rl.on("line", function(N) {
	N = parseInt(N);
	rl.on("line", function(questions) {
		questions = questions.split(" ").map(num => parseInt(num));
		if(questions.length == N){
			if(selectQuestions(questions).length>2) {
				//console.log(selectQuestions(questions));
				console.log("YES");
			}else{
				//console.log(selectQuestions(questions));
				console.log("NO");
			}
			rl.close();
		}else{
			console.log('문제개수와 입력개수가 맞지 않습니다. 다시 시도해 주세요');
			console.log(questions);
			//N = 0; //처음부터 시도 할 때
			questions = []; //입력값만 다시 입력 할 때
		}
	});
}).on("close", function() {
	process.exit();
});

//======================================================================================
//위 소스를 개선한 자바스크립트 소스 입니다.(아래-readline 입력객체 r1.on사용을 1개로 조정)
// Run by Node.js 개발자가 만든 selectQuestions() 함수 코드

const readline = require("readline");
const rl = readline.createInterface({
	input: process.stdin,
	output: process.stdout
});
function selectQuestions(questions) {
		questions.sort(function(a, b){ return a-b; });//문제 난이도 정렬
		let count = 0;//앞(before) , 뒤(question) 문제의 난이도가 틀린 개수
		let before = questions[0];//초기 이전 문제 난이도, current는 현재문제 난이도
		let answer = [before];//응답 배열 변수를 추가해서 ChatGPT 코드와 비슷하게 처리
		for(let current in questions) {
			//console.log(current); questions배열의 index값을 가져온다.
			if(before != questions[current] && before < questions[current]) {
				count++;
				answer.push(questions[current]);
			}
			if (count == 2) {
				break;
			}
			before = questions[current];//현재 난이도가 이전 난이도로 자리 이동
		}//forEach문(향상된 for문) 끝
		return answer;
	}
let N;
let questions = [];
rl.on("line", function(line) {
	questions.push(line);
	N = parseInt(questions[0]);//비교할 숫자의 개수
	if(typeof questions[1] == 'string') {
	    //매개변수 questions문자열을 split함수로 배열로 만들면서 map 반복함수로 배열값을 자동으로 추가(push)할 수 있다(아래)
		questions = questions[1].split(" ").map(num => parseInt(num));
		if(questions.length == N){
			rl.close();
		}else{
			console.log('문제개수와 입력개수가 맞지 않습니다. 다시 시도해 주세요');
			console.log(questions);
			N = 0; //처음부터 시도 할 때
			questions = []; //입력값만 다시 입력 할 때
		}
	}

}).on("close", function() {
	if(selectQuestions(questions).length>2) {
		//console.log(selectQuestions(questions));
		console.log("YES");
	}else{
		//console.log(selectQuestions(questions));
		console.log("NO");
	}
	process.exit();
});

- 아래는 위 ChatGPT가 만든 함수를 사용한 완성 코드를 테스트에서는 정상 작동하지만, 제출에서 오답이 발생된 예 입니다. 원인이 알수없이 15번째 테스트에서 오류가 나옵니다. 챗GPT 인공지능의 selectQuestions()함수를 사용한 답은 이럴 때 난감하게 됩니다.(아래) 단, 사람 개발자가 만든 코드는 제출에서도 오류 없이 통과가 됩니다.

- ChatGPT를 이용해 프로그램을 제작 할 때 개발 코드 자체로는 구글 검색엔진으로 검색해서 샘플코드를 찾는 점은 비슷하나, 완성형 코드에 더 근접한 내용을 답변으로 준다는 것이 장점이다.

 

PS1. 위에서 순서도를 그리고, 개발자가 제작한 코드와 ChatGPT 로 제작한 코드를 비교해 보면(실행성능은 비교에서 제외하고) 개발자가 구현한 코드가 소스 분석에 더 좋은 코드이고, 제출 상태에서도 정상이라는 것을 확인 할 수 있습니다.

위 내용을 확인해 보면서, AI 기술이 사람과 대결하는 구조로 보기 보다는 개발자로서 AI를 잘 활용하면 좋겠다고 생각이 듭니다. 개발자(사람)이 만든 코드로 제출한 결과 정답으로 통과 (아래)

 

- 추가 기능으로 아래 처럼 Java나 C언어 코드를 자바스크립트와 같은 다른 언어로 변환 할 때는 탁월한 성능을 보여준다.

#### 코드 변환 실습 순서(위 구름코딩테스트 문제의 C언어 코드를 자바스크립트로 변환-아래)

- 위 구름 코딩 테스트 사이트에서 기존에 자바와 C언어로 만들어진 완성된 코드를 확인 한다.

- 자바 스크립트 언어를 선택하면 기본 입출력 코드 서식만 있다.

- 위 ChatGPT 사이트에서 C언어로 완성된 코드를 자바스크립트 코드로 변환해 보라는 요청을 보낸다.

-- 아래 C언어 코드가 자바스크립트 언어로 변환 된 것을 볼 수 있다.

- 위 인공지능이 변환한 코드를 구름 코딩 테스트 화면에 입력한다.

-- 단 출력방식은 코딩 시험에 맞게 아래 처럼 2부분만 변경한다.

rl.question('Enter n_amount: ', (n_amount) => { -> rl.on('line', (n_amount) => { 이하 동일

-- 아래  구름코딩테스트 사이트의 [응시환경체험하기]에서  [테스트] 버튼으로 창 하단의 실행결과가 출력값 [일치] 로 성공된 것을 확인 할 수 있다.(아래)

- 아래는 위에서 ChatGPT 가 실행 성공한 C언어소스를 자바스크립트로 변환 한 소스코드이다.(아래)

const readline = require('readline');

const rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout
});

rl.on('line', (n_amount) => {
  n_amount = parseInt(n_amount);
  let n = Array(100).fill(0);
  let s = Array(20).fill(0);

  rl.on('line', (n_elements) => {
    n = n_elements.split(' ').map(Number);
    
    for (let i = 0; i < n_amount; i++) {
      s[n[i]]++;
    }
    
    let si = 0;
    for (let i = 0; i < 20; i++) {
      if (s[i] !== 0) {
        si++;
      }
      if (si >= 3) {
        console.log("YES");
        return rl.close();
      }
    }
    
    console.log("NO");
    rl.close();
  });
});

PS2. 참고로 openai.com 의 ChatGPT는 free research preview (무료 연구 미리보기) 버전이다.

- 사용하려면, 위 사이트에 회원 가입이 필요하거나, 구글 이메일 또는 MS 계정으로 회원가입없이 로그인 할 수 있다.

-- 단, 처음에는 사용하는 사람의 핸드폰 번호로 인증 문자를 받고, 인증 문자를 화면에 입력해야 사용가능하다.(아래)

관련글 더보기

댓글 영역