본문 바로가기
코테연습

78. 타켓 넘버 Javascript

by hxunz 2022. 7. 26.

https://school.programmers.co.kr/learn/courses/30/lessons/43165

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

1. 문제에 대한 이해

  • 우리가 풀어야 할 문제는 무엇인가?
     - 주어진 숫자들을 더하거나 빼서 타켓 넘버를 만들 수 있는 방법의 수를 구하라
  • 주어진 자료는 무엇인가?
     - numbers = 숫자가 담긴 배열
     - target = 타켓 넘버
  • 조건은 무엇인가?
     - 주어지는 숫자의 개수는 2개 이상 20개 이하
     - 각 숫자는 1 이상 50 이하
     - 타겟 넘버는 1 이상 1000 이하

2. 계획

  1. numbers의 첫번째 요소부터 하나씩 더하고 빼면서 값을 누적한다.
  2. 더하거나 뺀 요소는 제거하고 다시 1번을 반복한다.
  3. 누적값이 target과 같은것만 리턴한다.

3. 실행

  • 풀이 계획을 실행하고, 각 단계가 올바른지 점검하라.
const solution = (numbers, target, acc = 0) => {
  if (numbers.length === 0) {
    return target === acc ? 1 : 0;
  }

  const [first] = numbers;

  const plus = first;
  const minus = -first;

  return solution(numbers.slice(1), target, acc + plus) +
    solution(numbers.slice(1), target, acc + minus);
};

test('countMoney', () => {
  expect(solution([1], 1)).toEqual(1);
  expect(solution([1, 1, 1], 1)).toEqual(3);
  expect(solution([1, 2, 4], 1)).toEqual(1);
  expect(solution([2, 4, 1], 1)).toEqual(1);
  expect(solution([4, 2, 1], 1)).toEqual(1);
  expect(solution([2, 2, 2], 6)).toEqual(1);
  expect(solution([1, 1, 1, 1, 1], 3)).toEqual(5);
  expect(solution([4, 1, 2, 1], 4)).toEqual(2);
});

4. 반성

  • 어떻게 풀어나가야할지 모르겠다면 점진적으로 생각해봐야겠다. 
  • 이런 부족한 유형의 문제들을 더 풀면서 풀이에 익숙해져야겠다.

 

댓글