[2020 카카오 인턴십] 키 패드 누르기 JavaScript

ansrjsdn·2020년 7월 2일
0

알고리즘

목록 보기
37/39

문제

https://programmers.co.kr/learn/courses/30/lessons/67256

풀이

숫자들의 경우의 수들이 많지 않기 때문에 변수로 지정해주고 사용했다. 그리고 적힌 로직대로 했다... 주석 참고

코드

function solution(numbers, hand) {
  // left는 왼손으로 right는 오른손으로 나머지는 계산해서 사용
  const direction = {
    left: [1, 4, 7],
    right: [3, 6, 9],
  };
  // 넘버들의 위치이다. 사진대로 설정했다.
  const numberPosition = {
    1: [0, 0],
    2: [0, 1],
    3: [0, 2],
    4: [1, 0],
    5: [1, 1],
    6: [1, 2],
    7: [2, 0],
    8: [2, 1],
    9: [2, 2],
    '*': [3, 0],
    0: [3, 1],
    '#': [3, 2],
  };
  // left와 right에 시작 지점을 넣어주었다.
  
  let left = numberPosition['*'];
  let right = numberPosition['#'];
  let answer = '';
  
  numbers.forEach((number) => {
    // number가 left에 들어있으면 왼손, right에 있으면 오른손, 둘 다 없을 경우 거리를 계산, hand에 따라 다르게 누르도록 했다.
    if (direction.left.includes(number)) {
      answer += 'L';
      left = numberPosition[number];
    } else if (direction.right.includes(number)) {
      answer += 'R';
      right = numberPosition[number];
    } else {
      let [x, y] = numberPosition[number];
      let [lx, ly] = left;
      let [rx, ry] = right;
      let leftDistance = Math.abs(x - lx) + Math.abs(y - ly);
      let rightDistance = Math.abs(x - rx) + Math.abs(y - ry);
      
      if (leftDistance > rightDistance) {
        right = [x, y];
        answer += 'R';
      } else if (rightDistance > leftDistance) {
        left = [x, y];
        answer += 'L';
      } else {
        if (hand === 'right') {
          right = [x, y];
          answer += 'R';
        } else {
          left = [x, y];
          answer += 'L';
        }
      }
    }
  });

  return answer;
}
profile
프론트 공부를 열심히 하고 있는 대학생 개발자입니다.

0개의 댓글