본문 바로가기
알고리즘

[CodeKata] Week 1 - Day 1 (J.S)

by 프린벼르 2022. 2. 14.

codekata 1주차 day1

약 한 달 간, CodeKata를 한다고 한다. 매일 저녁 6시-7시까지 한 문제씩 두명이 함께 알고리즘 문제를 푸는 시간이다. 
정해진 배열에서 두 수를 뽑아 그 수의 합을 통해서 그 수가 배열의 몇번째에 위치하는지 찾는 문제다. 가장 먼저 떠올린 개념은 이중for문이였다. 이중 for문으로 반복문을 돌린 후, if문으로 정답을 찾아가는 로직을 생각했다. 
( 아래 그림처럼 맞을 때까지 반복해야하니 이중for문을 써야겠다고 생각했다. )

알고리즘 로직

const twoSum = (nums, target) => {
  // 아래 코드를 작성해주세요.
  for(let i = 0; i < nums.length; i++){
    for(let j = i+1; j < nums.length; j++){
      if((nums[i]+nums[j]) === target){
        return [i,j];
      }
    }
  }
}

좀 간단하게 로직을 짜서 틀리면 어떡하나.. 라는 생각이 조금은 들었다. 다행스럽게도 통과했다. 생각보다 빠르게 해결되서 다른 풀이로 문제를 접근했다. 바로 reduce()메소드를 활용해서 좀 다른 방향으로 문제를 풀어나갔다.

function solution(nums, target){
  let sum = nums.reduce((a,b)=>{return a+b}) //reduce 메소드 활용
  let result = (sum - target);
  for(let i = 0; i < nums.length; i++){
    for(let j = i+1; j < nums.length; j++){
      if(nums[i]+nums[j] === result){
        return [i,j];
      }
    }
  }
}

이렇게 풀면 특정수가 나오는 index를 제외한 배열이 출력된다.

다른 방향에서의 문제접근

배열.reduce( (누적값, 현재값, 인덱스, 요소) => { return 결과 }, 초기값 );
기본적으로 reduce 메서드도 다른 메서드와 동일하게 첫 번째 인자로 함수를 받는다. 하지만, 두 번째 인자로 초기값을 셋팅할 수 있다는 것에서 차이가 있다. 물론, 두 번째 인자는 생략이 가능하며, 생략 시에는 배열의 첫 번째 값이 그값을 담당한다.
< 매개변수 >
 arr.reduce ( callback [, initialValue ] )
callback : 배열의 각 요소에 대해 실행할 함수. 다음 네 가지 인수를 받음.
            - 누적값 : 누산기accmulator는 콜백의 반환값을 누적함. 콜백의 이전 반환값 또는, 콜백의 첫 번째  호출이면서                                            initialValue를 제공한 경우에는initialValue의 값.
            - 현재값 : 처리할 현재 요소.
            - 인덱스 (optional : 사용해도 되고 안해도 되고) : 처리할 현재 요소의 인덱스. initialValue를 제공한 경우 0,
                                                                                        아니면 1부터 시작.
            - array(optional : 사용해도 되고 안해도 되고) : reduce()를 호출한 배열.

initialValue
(optional : 사용해도 되고 안해도 되고) : callback의 최초 호출에서 첫 번째 인수에 제공하는 값.
                   초기값을 제공하지 않으면 배열의 첫 번째 요소를 사용. 빈 배열에서 초기값 없이 reduce()를 호출하면 오류가 발생.
const arr = [1, 2, 3, 4, 5];
const result = arr.reduce((acc, cur, idx) => { return acc += cur }, 0);
console.log(result);  // 15

const arr2 = [1, 2, 3, 4, 5];
const result2 = arr2.reduce((acc, cur, idx) => { return acc += cur }, 10);
console.log(result2);  // 25

댓글