프로그래머스 LEVEL 1([카카오 인턴] 키패드 누르기)

image

  • 사용 언어 : javascript

  • 해결 날짜 : 2022-08-04

  • 해결 방법 :

    • 숫자패드 끼리 거리를 구하기 위해 *은 10, 0은 11, #은 12로 인덱싱
    • 1,4,7인 경우 L
    • 3,6,9인 경우 R
    • 2,5,8,0인 경우 각 엄지 손가락과의 거리 비교를 통해 거리가 짧은 쪽으로 선택
    • 거리가 같은 경우 hand값에 따라 선택
  • 코드

  const difference = (a, b) => {
    return Math.abs(a - b);
  }

  const realDistance = (distance) => {
      if(distance === 0) return 0;
      else if(distance === 1 || distance === 3) return 1;
      else if(distance === 2 || distance === 4 || distance === 6) return 2;
      else if(distance === 5 || distance === 7 || distance === 9) return 3;
      else return 4;
  }

  function solution(numbers, hand) {
      var answer = '';
      var thumbs = [10, 12];
      for (number of numbers) {
          switch(number) {
              case 1:
              case 4:
              case 7:
                  answer += 'L';
                  thumbs[0] = number;
                  break;
              case 3:
              case 6:
              case 9:
                  answer += 'R';
                  thumbs[1] = number;
                  break;
              case 2:
              case 5:
              case 8:
              case 0:
                  number = number === 0 ? 11 : number;
                  var leftDistance = realDistance(difference(thumbs[0], number));
                  var rightDistance = realDistance(difference(thumbs[1], number));
                  if(leftDistance > rightDistance) {
                      answer += 'R';
                      thumbs[1] = number;
                  } else if(leftDistance < rightDistance) {
                      answer += 'L';
                      thumbs[0] = number;
                  } else {
                      if(hand === 'left') {
                          answer += 'L';
                          thumbs[0] = number;
                      }
                      else {
                          answer += 'R';
                          thumbs[1] = number;
                      }
                  }
                  break;
          }
      }
      return answer;
  }