본문 바로가기

공부/TIL-D

배열안의 원소의 합을 반복문을 사용하지 않고 구하기

const array = [1,2,3,4,5,6,7,8,9,10]

 

1~10까지의 연속된 숫자가 존재한다고 가정합니다. array의 합은 몇일까요?

 

const array = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];

function arraySum(array) {
  let sum = 0;

  for (let i = 0; i < array.length; i++) {
    sum += array[i];
  }

  return sum;
}

console.log(arraySum(array));

 

기본적인 방법은 반복문을 사용하는 것입니다.

질문의 조건에서 반복문을 사용하지 않는 것이었습니다.

 

자료구조 조건이 배열이니, 배열 고차 함수를 떠올렸습니다.

 

let sum = 0;

array.forEach((e) => (sum += e));

console.log(sum);

//forEach 사용

const reducer = (accumulator, currentValue) => accumulator + currentValue;
console.log(array.reduce(reducer));

//reduce 사용

그러나, 고차 함수도 내부에서는 반복문이 사용되고 있습니다. ( 폴리필 참조 )

 

고차 함수도 사용하지 못한다면 어떻게 할까요?

 

재귀가 있습니다.

다만, 재귀는 문제가 발생할 수 있는데, 문제에서 10이라는 범위를 정해주었기 때문에 사용 가능하다고 판단됩니다.

 

(20 이하 정도는 재귀를 사용해도 괜찮으나 그 이상은 콜 스택이 오버플로 될 수 있음)

 

const array = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
let sum = 0;

function recursive(array) {
  if (array.length > 0) {
    sum += array[0];
    array.shift();
    recursive(array);
  }
  return sum;
}

console.log(recursive(array));

심플하게 재귀 함수를 구현하였습니다.

 

배열이 비어있지 않다면, sum이라는 전역 변수에 배열의 첫 번째 원소 값을 누적하고, 원본 배열을 변경시킵니다.

 

그 후 변경된 배열을 바탕으로 재귀 함수를 호출합니다.

 

반복하다가 배열이 비게 되면 sum 값을 출력합니다.

재귀도 쓰지 말라면? 수식을 사용할 수밖에 없습니다

const array = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];

const lastNumber = array[array.length - 1];

function sum(lastNumber) {
  return (lastNumber * (lastNumber + 1)) / 2;
}

console.log(sum(lastNumber));

떠오르는 방법을 나열해보았습니다 또 어떤 방법이 있을까요?

 

 

* 문제에서 선행조건은 1~10이라는 '연속된' 숫자가 배열에 있다는 조건이었고, 없게 된다면 로직을 전체를 변경시켜야 되며, 정렬이 돼있기 때문에 따로 정렬은 추가하지 않았습니다.

 

반응형

'공부 > TIL-D' 카테고리의 다른 글

프로미스  (0) 2019.08.06
[JS]프로토타입  (0) 2019.08.03
Cold observalbe Hot observable  (0) 2019.06.27
생명주기  (0) 2019.06.25
scroll 복습  (0) 2019.06.24