[Programmers](Level1) 키패드 누르기

주형(Jureamer)·2022년 4월 9일
0

문제명: [카카오 인턴] 키패드 누르기

문제설명: 스마트폰 전화 키패드의 각 칸에 다음과 같이 숫자들이 적혀 있습니다...(생략)

문제풀이

카카오 문제라 그런지 Level1단계임에도 불구하고 굉장히 많은 코드량이 들어갔다.
처음에는 단순히 키패드 숫자로만 계산하다 여러 번 수정을 거친 후
coordinate(좌표) 값을 통한 2차원 배열로 문제를 풀었다!

다 풀고나서 여러 코드들을 살펴보니 3으로 나눈 나머지 값을 이용해 좀 더 깔끔히 짤 수 있을 듯하다.

function solution(numbers, hand) {
  var answer = '';
  // 147 왼손 369 오른손
  // 그 외는 가까운 손가락 or 같은 거리일 땐 주 손으로 이용
  const rows = 3, 
        columns = 3;
  const keypad = [...Array(rows)].map((_, r)=>[...Array(columns)].map((_, c)=>r*columns+c+1));
  keypad.push(["*", 0, "#"]);
  const coordinate = {}
  for(let i = 0; i < keypad.length; i++) {
    for(let j = 0; j < keypad[0].length; j++) {
      coordinate[keypad[i][j]] = [i, j];
    }
  }
  
  let leftHand = "*";
  let rightHand = "#";
  
  function pushWithLeftHand (num) {
      answer = answer.concat('L');
      leftHand = num;
  }
  
  function pushWithRightHand (num) {
      answer = answer.concat('R');
      rightHand = num;
  }

  function calculateDist (num, numToPush) {
    const IdxOfNum = Object.keys(coordinate).findIndex((each) => each === String(num));
    const coordinateOfNum = Object.values(coordinate)[IdxOfNum];
    const IdxOfNumToPush = Object.keys(coordinate).findIndex((each) => each === String(numToPush));
    const coordinateOfNumToPush = Object.values(coordinate)[IdxOfNumToPush];
    const diffOfDist = Math.abs(coordinateOfNum[0]-coordinateOfNumToPush[0])+Math.abs(coordinateOfNum[1]-coordinateOfNumToPush[1]);
    return diffOfDist;
  }
  
  for(const num of numbers) {
    if(num === 1 || num === 4 || num === 7) {
        pushWithLeftHand(num)
    } else if(num === 3 || num === 6 || num === 9) {
        pushWithRightHand(num)
    } else {
      const leftDist = calculateDist(num, leftHand);
      const rightDist = calculateDist(num, rightHand);
      // 왼쪽이 더 가깝다면 
      if(leftDist < rightDist) {
        pushWithLeftHand(num)
      // 오른쪽이 더 가깝다면
      } else if(leftDist > rightDist) {
        pushWithRightHand(num)
      // 거리가 같다면
      } else {
        if(hand === 'left') {
        pushWithLeftHand(num)
        } else {
        pushWithRightHand(num)
        }
      }
    }
  }
  return answer;
}

// test case 1 =>  LRLLLRLLRRL
console.log(solution([1, 3, 4, 5, 8, 2, 1, 4, 5, 9, 5], "right"));

// test case 2 => "LRLLRRLLLRR"
console.log(solution([7, 0, 8, 2, 8, 3, 1, 5, 7, 6, 2],"left"));

// // test case 3 => 	"LLRLLRLLRL"
console.log(solution([1, 2, 3, 4, 5, 6, 7, 8, 9, 0], "right"));
profile
작게라도 꾸준히 성장하는게 목표입니다.

0개의 댓글