V-logue

[항해99] 프로그래머스 - 음양 더하기 본문

항해 99/프로그래머스 Algo

[항해99] 프로그래머스 - 음양 더하기

보그 2022. 5. 13. 19:55

 

대충 이런 설명에

이런 예시가 있다. 먼저 최종적인 결과물부터 보자,

 

function solution(absolutes, signs) {
    return absolutes.reduce(
      (acc, cur, i) => acc + cur * (signs[i] ? 1 : -1),0);
  }

솔직히 말하면, 음양 더하기는 스스로 직접풀지는 않았다.

대신 reduce라는 함수와 삼항연산자라는 개념에 대해서 배운 의미있는 시간이었다.

 

먼저 reduce 함수란

let result = arr.reduce(callback);
let result = arr.reduce(callback, initValue); // option for initial value

reduce(callback{콜백함수}, initValue{초기값})메소드는 array의 각 element에 함수를 적용하여 array를 단일값으로 reduce 하는데 사용된다.

 

사실 저게 무슨소리인지 이해하는데부터 시간이 오래걸렸다. 내가 제대로 이해했는지는 모르겠지만, 

 

내가 이해한 바로는

 

먼저 코드의 result는 return되는 값이고, arr는  reduce함수가 실행되는 배열이다. 

 

그렇다면 callback은? 

 callback은 reduce함수로인해 배열의 요소들에 실행되는 함수다.

 

callback함수는

  • accumulator(누산기): 누산기는 콜백(리듀서)의 반환 값을 누적한다. 만약 초기값이 제 공된다면, 리듀서의 첫번째 호출 시 accumulator의 값은 초기값과  같다. 만약 초기값이 제공되지 않는다면 accumulator는 배열의 첫 번째 값이 자동으로 들어가게된다.    
  • currentValue: 현재 처리할 요소이다. 
  • currentIndex(optional): 처리할 현재 요소의 인덱스이다. 초기값이 제공되지 않았다면  accumulator에 배열의 첫번째 값인 index 0의 값이 들어가고,  currentIndex는 index 1부터 시작하게된다. 
  • array(optional): reduce()를 호출한 배열

로 이루어져 있다.

 

한편, arr.reduce( callback[, initialValue]) 인데,
초기값인 initialValue값을 지정하지 않으면, 배열(arr)의 첫번째 요소가 사용된다.

배열의 각 요소가 주어진 콜백함수를 거친다 = 배열(arr)의 각 요소가 주어진 콜백함수
를 거치기 때문에 배열의 각 요소가 acc에 누적된다.

결국 반환 값은 acc에 누적된 값이다.

여기서 initialValue를 제공하지 않는다면, acc값은 배열의 첫번째 값이고 cur값은 두번째 값이다.
acc의 초기값이 설정되야 하는데, 배열에 초기값 요소없이 reduce( )를 사용하면 오류가 발생한다.

 reduce 는 this callback(accumulator 누적값)의 결과를 한 배열(array) 요소에서 다른 배열(array)의 요소(element)로 전달하는데, 저 코드를 작성한 분은 화살표 함수를 사용했다.

 

 화살표 함수는 function 키워드 대신 화살표(=>)를 사용하여 보다 간략한 방법으로 함수를 선언할 수 있는데, 아무때나 사용할 수 있는 것은 아니고 귀찮기 때문에 대신 검색해보기를 추천한다.

 

(acc, cur, i) => acc + cur * (signs[i] ? 1 : -1),0);

우선 acc값의 초기값은 0으로 설정되 있기 때문에, acc값은 0이고 0 + cur * (sign[i] ? 1 : -1) ~~가 실행된다.

각 요소들이 다 한번씩 실행되기 때문에 cur * ~과정을 배열의 모든 요소마다 한번씩 거치게 되는데

내가 가장 궁금했던 것은 signs[i] ? 1 : -1이라는게 도대체 어떤걸 의미하는지 이해할 수 없었다는 점이다.

 

한참을 해메다가 알게된것이 바로  삼항연산자이다.

삼항연산자는 

참/거짓에 따라 선택적으로 실행되는 조건문이다.

조건문 ? 선택문1:선택문2

삼항연산자는 위와같이 이루어져 있다. 조건문이 참이면 선택문1을 실행하고, 조건문이 거짓이면 선택문 2를 실행한다.

 

자바스크립트 삼항 연산자 기능은 세개 항으로 연산을 처리한다.
세 개의 항은 각각 조건문 하나와 선택문 두 개로 구성된다.
삼항 연산자는 조건문이 True일때 선택문1을 실행한다. 조건문이 false일 때 선택문2를 실행한다.

 

조건문과 선택문을 구분하는 기호는 물음표 ? 를 사용한다. 선택문1과 선택문2를 구분하는 기호는 클론 : 을 사용한다.

 

그렇기 때문에

signs[i]가 참이면 배열 absolutes[i]의 실제 정수가 양수고, 그렇지 않다면 음수임을 의미하는 제한을 고려한 끝에

위와 같은 코드가 나오게 됐다는게 내 생각이다.

 

실행되는 조건문 signs[i]가 true면 1, false면 -1을 이라는 내용이 선택되고 현재 실행되는 요소값인

 

cur * (선택문에 따라 실행된 값)이 곱해지게되는 결과가 된 것이다.

 

정확히 이해했다고는 할 수 없지만.. 배워가는 것은 있었다.

 

 

 

 

 

 

 

※ 이 글에 오류가 있었다면 따로 댓글을 남겨주시면 감사하겠습니다.  

Comments