241022 코테

수달·2024년 10월 22일

Q. 정수 n을 입력받아 n의 약수를 모두 더한 값을 리턴하는 함수, solution을 완성해주세요.

💫 나는 그냥 for문으로 풀었는데 오늘 배운 삼항연산자로 푸는 방법이 있어서 챗지피티한테 자세한 답변을 물어봤다.

A.

function solution(n, a=0, b=0) {
    return n <= a / 2 ? b : solution(n, a + 1, b += n % a ? 0 : a);
}
  • 매개변수:
    n: 입력받은 숫자 (계산의 대상이 되는 숫자)
    a: 초기값은 0으로 설정되며, 재귀 호출마다 1씩 증가함
    b: 초기값은 0으로 설정되며, 어떤 값을 누적해서 저장하는 역할
  • 기본 개념:
    이 함수는 재귀적으로 호출되며, 특정 조건이 충족될 때까지 반복됩니다.
    최종적으로 반환하는 값은 b, 즉 누적된 합입니다.

1. 재귀 호출 종료

n <= a / 2 ? b : ...
  • 조건: n <= a / 2
  • 이 조건이 참(true)이면 b를 반환하고, 거짓(false)이면 ... 뒤의 내용을 실행합니다.

이것은 재귀 호출을 종료하는 역할을 합니다. a가 n / 2보다 커지면 재귀를 멈추고 최종적으로 b의 값을 반환하는 거예요.

2. 재귀 호출

n <= a / 2 ? b : solution(n, a + 1, b += n % a ? 0 : a);
  • 만약 n <= a / 2가 거짓이면, 삼항 연산자의 거짓 부분인 solution(n, a + 1, b += n % a ? 0 : a);가 실행됩니다.
  • 즉, 재귀 호출이 계속되는 거죠.

3. 삼항 연산자

b += n % a ? 0 : a
  • 조건: n % a (이 값이 0인지 아닌지를 확인)
  • n % a는 n을 a로 나눈 나머지입니다.
    만약 나머지가 0이면, n이 a로 나누어떨어지는 것이고, a는 n의 약수라는 뜻이 됩니다.
  • 참일 때: 0 (나머지가 0이 아니면 0을 더하지 않습니다)
  • 거짓일 때: a (나머지가 0이면, a를 b에 더합니다)

이렇게 재귀를 통해 a를 1씩 증가시키면서 n의 약수인 값들을 b에 더해 나가는 구조입니다.

4. 예시:

만약 n = 10이라면:

처음에 a = 1, b = 0으로 시작합니다.
10 % 1은 0이므로, b에 1을 더해 b = 1이 됩니다.
재귀가 호출되면서 a는 2로 증가, 10 % 2는 0이므로 b = 1 + 2 = 3.
이런 식으로 a가 n / 2를 넘기 전까지 재귀 호출이 반복됩니다.

5. 요약:

이 함수는 주어진 숫자 n의 약수를 찾아 모두 더한 후 반환합니다. a가 n의 약수일 때마다 b에 a를 더하고, a가 n/2를 초과하면 종료됩니다.

0개의 댓글