05_arrSum

TK·2022년 6월 27일

[코플릿] 재귀

목록 보기
5/9

💬 문제

배열을 입력받아 모든 요소의 합을 리턴해야 합니다.

📁 입력

  • 인자 1 : arr
    number 타입을 요소로 갖는 배열

📂 출력

  • number 타입을 리턴해야 합니다.
  • arr[0] + arr[1] + ... + arr[n-1]
  • arr.length는 n

주의 사항

  • 함수 arrSum은 재귀함수의 형태로 작성합니다.
  • 반복문(for, while) 사용은 금지됩니다.
  • 입력받은 배열은 함수의 호출 뒤에도 처음 상태를 유지해야 합니다(immutability).
  • 입력으로 들어오는 arr의 모든 요소는 정수 값을 갖는다고 가정합니다.
  • 빈 배열의 합은 0 입니다.

📺 입출력 예시

let output = arrSum([-1, -2, 1, 3]);
console.log(output); // --> 1

🔮 힌트

  • 배열은 head와 tail을 통해 재귀적으로 정의될 수 있습니다.
  • head는 배열의 첫 요소를 말합니다.
  • tail은 배열이 head가 제거되고 남은 배열을 말합니다.
    a. ㅁ =>
    b. 1 => 1 +
    c. 1, 2 => 1 + 2
    d. 1, 2, 3 => 1 + 2, 3
  • 3번의 [2]는 2번에 의해서 2 + [ ]로 정의되고, 따라서 [1, 2]는 최종적으로 1 + 2 + [ ] 로 정의될 수 있습니다.
  • 같은 방식으로 4번을 정의해보세요.
  • 길이가 1 이상인 배열 arr이 주어졌을 때 head와 tail은 각각 다음과 같이 구할 수 있습니다.
const head = arr[0];
const tail = arr.slice(1);
  • arrSum(arr)은 arr의 head에 arrSum(tail)을 더하는 방식으로 구할 수 있습니다.

정답 및 나만의 해석

function arrSum(arr) {
  if (arr.length === 0) {			// 빈 배열일 경우
    return 0;						// 0을 리턴한다.
  }

  // const [head, ...tail] = arr;
  const head = arr[0];				// arr 0번째 인덱스를 변수 head에 할당하고
  const tail = arr.slice(1);		// arr 0번째 인덱스를 제외한 나머지 부분을 변수 tail에 할당한다.
  return head + arrSum(tail);		// head + arrSum(tail) => basic case가 될 때까지 반복
}
  
  /* 입출력 예시
  let output = arrSum([-1, -2, 1, 3]);
  1. 빈배열이 아니므로 if문은 지나감
  2. head = -1
  3. tail = [-2, 1, 3]
  4. 반환 : -1 + arr([-2, 1, 3])
  ---
  5. arr([-2, 1, 3])
  6. 빈배열이 아니므로 if문은 지나감
  7. head = -2
  8. tail = [1, 3]
  9. 반환 : -2 + arr([1, 3])
  ---
  10. arr([1, 3])
  11. 빈배열이 아니므로 if문은 지나감
  12. head = 1
  13. tail = [3]
  14. 반환 : 1 + arr([3])
  ---
  15. arr([3])
  16. 빈배열이 아니므로 if문은 지나감
  17. head = 3
  18. tail = []
  19. 반환 : 3 + arr([])
  ---
  20. arr([])
  21. 빈배열이므로 0을 반환.
  ---
  22. 위에 반환된 모든 숫자들을 모아보면 -1-2+1+3 = 1로 계산됨
  */
                                                        

📝 한줄평

전혀 감을 못잡겠어서 레퍼런스를 보고 '아~' 싶었다. 그리고 여기서 메서드 slice를 사용하면서 이 메서드를 이런식으로 활용한다는 것을 배울 수 있었다.
뒤에나오는 문제들에서도 slice를 많이 활용하게 되었다.

profile
쉬운게 좋은 FE개발자😺

0개의 댓글