본문 바로가기

Javascript/Others

chatGPT가 생각하는 가장 멋진 JavaScript 코드는 무엇일까? (1) (feat. 재귀 함수)

반응형
chatGPT가 생각하는 가장 멋진 JS 코드 (1)
이전 포스트에서는 chatGPT가 생각하는 '가장 아름다운 CSS'에 대해서 알아보았다.
이번 포스트에서는 chatGPT가 생각하는 '가장 멋진 JavaScript'가 무엇인지 알아보고자 한다.
물론 이런 질문을 한다고 해서 아주 질 좋은 내용이 나오리라고는 생각하지 않는다.
하지만 그럼 어떤가.
이런 주관을 묻는 질문으로 어떤 결과를 출력해주는 것만으로도 충분히 재미있고 흥미롭다고 생각이 든다.
chatGPT가 사람처럼 생각해서 하는 것이 아닌 쌓인 데이터를 기반으로 작성을 해주는 것이니 그래도 아주 조금은 신빙성 있지 않을까 싶기도 하다.
계속 질문하다보면 나에게든 누구에게든 참고를 할만한 내용이 나오지 않을까하는 생각도 해본다.
아무쪼록 재미로만 봐주시면 감사하겠다.
Question
너가 생각하는 가장 멋진 JavaScript 코드를 작성해줘
Answer
저는 가장 멋진 JavaScript 코드 중 하나로, "나무 구조 출력" 알고리즘을 들 수 있겠습니다.
이 알고리즘은 재귀함수를 활용하여, 주어진 숫자 n에 따라 나무 구조를 출력하는 기능을 구현한 코드입니다.

다음은 JavaScript로 작성된 나무 구조 출력 알고리즘 코드 예시입니다.

function drawTree(n) {
  let output = '';
  for (let i = 1; i <= n; i++) {
    let row = '';
    for (let j = 1; j <= n - i; j++) {
      row += ' ';
    }
    for (let k = 1; k <= 2 * i - 1; k++) {
      row += '*';
    }
    output += row + '\n';
  }
  console.log(output);
}

drawTree(5);		
				
위 코드는 drawTree 함수를 정의하고, 이 함수를 호출할 때 주어진 인자에 따라 나무 구조를 출력합니다.
이를 위해 for문을 사용하여, 각 줄마다 적절한 수의 공백과 별표를 출력하도록 구현하였습니다.

재귀함수를 활용한 이 알고리즘은, 매우 간결하면서도 흥미로운 결과를 출력하므로, JavaScript 코드 중에서 가장 멋진 코드 중 하나로 꼽을 수 있습니다.
음...? 기대한 것에 비하면 뭔가 초라해보이는 걸 출력해주었다.
"나무 구조 출력"이라는 알로리즘을 출력해주었다.
저 코드를 실행해서 console.log를 확인해보면 다음과 같다.
    *
   ***
  *****
 *******
*********
결과물을 보니 예전에 코딩테스트에서 봤었던 것 같다. (나무 그리기 문제)
코딩테스트도 제대로 준비해본 적은 없고 몇몇개 샘플만 본 적 밖에 없는데 그 중에 하나였던 것으로 기억이 난다.
이건 일단 둘 째 치고... 난 아무리 봐도 저게 왜 멋지다는 건지 GPT 선생님의 생각을 모르겠다 ㅎ...
이유를 한번 물어보자.
Question
나무 구조 출력 알고리즘이 왜 멋지다고 생각해?
Answer
"나무 구조 출력" 알고리즘은 다음과 같은 이유로 멋지다고 생각합니다.
1. 쉬운 이해와 구현: 간단한 for문과 조건문만으로도 구현할 수 있으며, 알고리즘이 단순하기 때문에 누구나 쉽게 이해하고 구현할 수 있습니다.

2. 다양한 응용 분야: "나무 구조 출력" 알고리즘은 ASCII 그림, 게임, 자료 구조 등 다양한 분야에서 활용될 수 있습니다.

3. 재미와 창의성: 나무의 크기나 형태를 자유롭게 조절할 수 있기 때문에, 이를 이용하여 새로운 도전과 창의적인 작업을 시도할 수 있습니다. 이를 통해 코딩에 대한 재미와 창의성을 느낄 수 있습니다.

4. 시각적 효과: "나무 구조 출력" 알고리즘을 활용하여 출력된 결과물은 시각적으로 매우 효과적입니다. 이를 이용하여 다양한 프로그램에서 시각적인 효과를 구현할 수 있습니다.

이처럼 "나무 구조 출력" 알고리즘은 쉽고 다양한 활용 분야를 가지고 있으며, 창의성과 시각적 효과를 제공한다는 점에서 멋지다고 생각합니다.
다양한 응용 분야 부분이 가장 눈에 들어온다.
ASCII 그림, 게임, 자료 구조 ...
저 분야에 대해선 자세히 알진 못해서 사실 더 할 말이 없다...
그리고 저 코드를 활용해서 무언갈 만들어보자 하고 고민을 해보았지만 실용적인 아이디어는 떠오르지 못했다... 이건 나중에 시간내서 다시 한번 고민해봐야겠다. 😅

그래서 이번 글은 chatGPT가 작성해준 내용 중에서 '재귀 함수'에 대해서 공부해보는 시간을 가졌다.
재귀 함수
재귀함수(Recursion function)는 함수가 자기 자신을 호출하는 프로그래밍 기법 중 하나이다.
반복문을 사용하는 것보다 간결하게 문제를 해결할 수 있으나 잘못 구현되면 스택 오버플로와 같은 메모리 문제를 일으킬 수 있기 때문에 주의가 필요하다.

재귀 함수는 주로 다음 두가지 구성 요소로 이루어져 있다.
- Base case : 재귀 호출을 중단하기 위한 경우
- Recursive case : 자기 자신을 호출하기 위한 경우
해당 내용을 이해하기 쉬운게 팩토리얼(factorial) 함수를 만들어보는 것이 가장 좋았다.

const factorial = (n) => {
	if( n == 0 ) return 1;
	else {
		return n * factorial(n-1);
	}
}

console.log(factorial(4)); // 24
	
콘솔 로그로 결과를 확인하면 24가 출력된다.

4! = 4*3*2*1 = 24

factorial 함수를 보면 n이 0일 때 1을 반환하고, 그 외의 경우에는 n * factorial(n-1)을 반환한다.
이떄 factirial 함수 자기 자신을 호출해서 return 해주는 것을 볼 수 있다.

[Base case]
'n이 0일 때 1을 반환' 부분을 Base case라고 하며, 이는 재귀 호출을 중단하기 위함이다. Base case를 선언하지 않으면 함수가 무한으로 호출되어 스택 오버플로와 같은 문제가 발생할 수 있다.

[Recursive case]
'n * factorial(n-1)' 부분을 Recursive case라고 하며, 함수가 자기 자신을 호출하는 부분이다.

재귀 함수는 팩토리얼 외에도 피보나치 수열, 최대공약수 등 수학적 계산에 사용될 수 있다.
트리 및 그래프 탐색에서도 재귀 함수를 사용할 수 있다.
ex) 깊이 우선 탐색(DFS)
사실 이 글은 chatGPT에게 주관적인 질문을 하고 출력된 결과를 활용해서 무언가를 만드는 것이 목표였다.
근데 작성하고 나서 보니 오히려 공부를 더 하게 되는 것 같다.
이 글을 작성하면서 트리, 그래프, BFS, DFS 등 자료 구조 관련된 내용도 겸사겸사 공부하게 됐다.
코딩을 취미 삼아 하고 있는 것이기에 더더욱 도움되는 지식이기도 했고,
특히 여러 지식(잡지식 😎)을 쌓는 것을 좋아하는 나에게는 이런 것이 좋은 건 사실이다.
chatGPT가 여러모로 정말 도움이 많이 된다는 것을 새삼 다시 느꼇다.


근데 재귀 함수에 대해서 공부를 좀 하고서 chatGPT가 작성한 코드를 봤는데... 재귀 함수...가 맞나 싶긴하다 ㅎ...
역시 사람이 검수를 할 필요성은 있어보인다...🤔
반응형

loading