본문 바로가기
코테연습

136. 이것이 코딩 테스트다 : 12장 럭키 스트레이트 Javascript

by hxunz 2022. 9. 15.

1. 문제에 대한 이해

  • 우리가 풀어야 할 문제는 무엇인가?
     - 점수 N이 주어졌을 때 럭키 스트레이트를 사용할 수 있는 상태인지 아닌지 구하라
  • 주어진 자료는 무엇인가?
     - 현재 점수 N

     - 특정 조건 = 현재 캐릭터의 점수를 N이라고 할 때 자릿수를 기준으로 점수 N을 반으로 나누어 왼쪽 부분의 각 자릿수의 합과 오른쪽 부분의 각 자릿수의 합을 더한 값이 동일한 상황
  • 조건은 무엇인가?
     - N의 자릿수는 항상 짝수이다.

2. 계획

  1. N을 쪼개서 배열로 만든다.
  2. 이를 인덱스0부터 절반까지 순회한 것과 절반부터 마지막 인덱스까지 순회한 것을 비교한다.
  3. 같으면 LUCKY를 리턴하고 같지 않으면 READY를 리턴한다. 

3. 실행

  • 풀이 계획을 실행하고, 각 단계가 올바른지 점검하라.
const solution = (N) => {
  // N을 쪼개서 배열로 만든다.
  const num = N.toString().split('').map((it) => Number(it));

  // 이를 인덱스0부터 절반까지 순회한 것과 절반부터 마지막 인덱스까지 순회한 것을 비교한다.
  let left = 0;
  let right = 0;

  for (i = 0; i < num.length / 2; i++) {
    left += num[i]
  }
  for (i = num.length / 2; i < num.length; i++) {
    right += num[i]
  }

  // 같으면 LUCKY를 리턴하고 같지 않으면 READY를 리턴한다.
  return left === right ? 'LUCKY' : 'READY'
}

test('luckyOrReady', () => {
  expect(solution(123402)).toEqual('LUCKY');
  expect(solution(7755)).toEqual('READY');
})

4. 반성

  • 누적값 구하는 부분을 reduce로 풀어볼 수 있을 것 같다. 
const solution = (N) => {
  // N을 쪼개서 배열로 만든다.
  const num = N.toString().split('').map((it) => Number(it));

  // 이를 인덱스0부터 절반까지 순회한 것과 절반부터 마지막 인덱스까지 순회한 것을 비교한다.
  const left = num.slice(0, num.length / 2).reduce((acc, cur) => acc + cur);
  const right = num.slice(num.length / 2).reduce((acc, cur) => acc + cur);

  // 같으면 LUCKY를 리턴하고 같지 않으면 READY를 리턴한다.
  return left === right ? 'LUCKY' : 'READY'
}

 

댓글