본문 바로가기
코테연습

104. 이것이 코딩 테스트다 8장 : 개미 전사 Javascript

by hxunz 2022. 9. 4.

1. 문제에 대한 이해

  • 우리가 풀어야 할 문제는 무엇인가?
     - 개미 전사가 얻을 수 있는 식량의 최댓값을 구하라
  • 주어진 자료는 무엇인가?
     - N = 식량 창고의 개수
     - K = 식량 창고에 저장된 식량의 개수를 나타낸 배열
  • 조건은 무엇인가?
     - 식량 창고를 털 때에는 서로 인접한 식량 창고를 털 수 없다. 반드시 한개의 식량 창고를 건너뛰어야한다. 

2. 계획

  1. 홀수번에 있는 식량 창고를 털 경우
    털 수 있는 식량창고의 인덱스는 1,3,5,7 ... 
    K의 홀수번 인덱스를 순회하면서 더한다.
  2. 짝수번에 있는 식량 창고를 털 경우
    털 수 있는 식량 창고의 인덱스는 2,4,6,8 ... 
    K의 짝수번 인덱스를 순회하면서 더한다.
  3. 둘 중에 더 큰 값을 리턴한다. 

3. 실행

  • 풀이 계획을 실행하고, 각 단계가 올바른지 점검하라.
const solution = (K) => {
  // 홀수번에 있는 식량 창고를 털 경우
  // 털 수 있는 식량창고의 인덱스는 1, 3, 5, 7 ...
  // K의 홀수번 인덱스를 순회하면서 더한다.
  const odd = K.reduce((acc, cur, i) => {
    if (i % 2) acc.push(cur);
    return acc;
  }, [])
    .reduce((acc, cur) => acc + cur, 0);

  // 짝수번에 있는 식량 창고를 털 경우
  // 털 수 있는 식량 창고의 인덱스는 2, 4, 6, 8 ...
  // K의 짝수번 인덱스를 순회하면서 더한다.
  const even = K.reduce((acc, cur, i) => {
    if (i % 2 === 0) acc.push(cur);
    return acc;
  }, [])
    .reduce((acc, cur) => acc + cur, 0);

  // 둘 중에 더 큰 값을 리턴한다.
  return odd > even ? odd : even
};

test('foodValue', () => {
  expect(solution([1, 3, 1, 5])).toEqual(8);
});

4. 반성

  • reduce를 두번 사용하지않고 한번 사용하면서 값을 더할 수 있을 것 같다. 

댓글