본문 바로가기
코테연습

103. 이것이 코딩 테스트다 8장 : 1로 만들기 Javascript

by hxunz 2022. 9. 4.

1. 문제에 대한 이해

  • 우리가 풀어야 할 문제는 무엇인가?
     - 정수 X가 주어졌을 때 연산 4개를 적절히 사용하여 1을 만들때, 연산을 사용하는 횟수의 최솟값을 출력하라.
  • 주어진 자료는 무엇인가?
     - X = 정수

     - 연산 4가지 : X가 5로 나누어 떨어지면 5로 나눈다. X가 3으로 나누어 떨어지면 3으로 나눈다. X가 2로 나누어 떨어지면 2로 나눈다. X에서 1을 뺀다.

2. 계획

  • 이 문제를 푸는데 있어서 유용하게 쓸 수 있는 지식은 무엇인가?
     - 재귀
  1. X가 5로 나누어 떨어지면 5로 나누고 count+1을 한다.
  2. X가 3으로 나누어 떨어지면 3으로 나누고 count+1을 한다.
  3. X가 2로 나누어 떨어지면 2로 나누고 count+1을 한다.
  4. X에서 1을 빼고 count+1을 한다.
  5. count 값을 리턴한다.

3. 실행

  • 풀이 계획을 실행하고, 각 단계가 올바른지 점검하라.
const solution = (X, count = 0) => {
  // count 값을 리턴한다.
  if (X === 1) {
    return count
  }

  // X에서 1을 빼고 count + 1을 한다.
  if ((X - 1) % 5 === 0) {
    return solution(X - 1, count + 1)
  }

  // X가 5로 나누어 떨어지면 5로 나누고 count + 1을 한다.
  if (X % 5 === 0) {
    return solution(X / 5, count + 1)
  }

  //     X가 3으로 나누어 떨어지면 3으로 나누고 count + 1을 한다.
  if (X % 3 === 0) {
    return solution(X / 3, count + 1)
  }

  //       X가 2로 나누어 떨어지면 2로 나누고 count + 1을 한다.
  if (X % 2 === 0) {
    return solution(X / 2, count + 1)
  }

};

test('findNumber', () => {
  expect(solution(26)).toEqual(3);
});

4. 반성

  • 5,3,2 전부 다 나누어지지 않는 경우 -1을 연산을 하는 식으로 문제를 풀어봤는데 
    그렇게 하니까 최소 연산 횟수를 구할 수 없었다. 
    그래서 -1 연산을 가장 큰 수인 5를 나눌 경우와 함께 생각해보았다.
    -1 연산을 한 후 그 값이 5로 나누어 떨어지는지 아닌지에 대한 여부를 확인하고 연산을 할 수 있도록 하였다. 
  • 테스트는 통과 되었지만 이 방법이 완벽한 방법일까라는 의문이 들었다. 
  • 다른 테스트 케이스들을 더 생각해보고 코드 검증을 해봐야될 것 같다.

 

댓글