키패드 누르기

Creating the dots·2021년 10월 26일
0

Algorithm

목록 보기
32/65
post-custom-banner

프로그래머스

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

나의 풀이

  • 1,4,7은 현재 손가락의 위치가 어디든 왼손으로 누르고 3,6,9는 오른손으로 누르면 된다.
  • 2,5,8,0의 경우 현재 손가락 위치에서 누르려는 숫자와 가까운 손가락으로 눌러야한다.
  • 따라서 현재 왼쪽과 오른쪽 손가락 위치를 업데이트하면서 2,5,8,0 중 하나를 눌러야할때 왼쪽 손가락과 오른쪽 손가락, 그리고 누르려는 숫자의 좌표를 구한 뒤(findIdx 함수) 결과 좌표값을 토대로 거리를 각각 계산한다. (왼손에서 숫자까지, 오른손에서 숫자까지)
  • 거리를 비교해 더 작은 값의 손가락을 리턴한다.
  • 거리가 똑같다면 매개변수로 주어진 hand를 리턴한다.
function solution(numbers, hand){
  const keypad = [
        [1,2,3],
        [4,5,6],
        [7,8,9],
        ["*",0,"#"]
  ];
  let nowLeft = "*"; //맨 처음 왼손의 위치
  let nowRight = "#"; //맨 처음 오른손의 위치
  let res = ""; //리턴할 결과값
  
  //숫자의 위치(좌표)를 찾는 함수 (거리를 계산하기 위해서는 위치가 필요하기 때문)
  const findIdx = (idx, num) => {
    for(let i=0;i<keypad.length;i++){
      if(keypad[i].includes(num)){
        idx.push(i, keypad[i].indexOf(num));
        return idx;
      }
    }
  }
  
  //좌표 간 거리를 계산해 더 가까운 손가락을 알려주는 함수
  const calcDistance = (leftArr, rightArr, nextNum, hand) => {
    const nextNumIdx = findIdx([],nextNum);
    const path1 = Math.abs(leftArr[0]-nextNumIdx[0]) + Math.abs(rightArr[1]-nextNumIdx[1]); //왼손거리
    const path2 = Math.abs(rightArr[0]-nextNumIdx[0]) + Math.abs(rightArr[1]-nextNumIdx[1]); //오른손거리
    if(path1>path2){ //오른손으로 가는 것이 더 가깝다면
      nowRight = nextNum;
      return "R";
    }
    else if(path1<path2){ //왼손으로 가는 것이 더 가깝다면
      nowLeft = nextNum;
      return "L";
    }else{
      return `${hand}`;
    }
  }
  
  for(let i=0;i<numbers.length;i++){
    if([1,4,7].includes(numbers[i])){
      nowLeft = numbers[i];
      res += "L";
    }
    else if([3,6,9].includes(numbers[i])){
      nowRight = numbers[i];
      res += "R";
    }else{
      const leftIdx = findIdx([], nowLeft);
      const rightIdx = findIdx([], nowRight);
      const output = calcDistance(leftIdx, rightIdx, numbers[i], hand);
      
      if(output === "L" || output === "left"){
        nowLeft = numbers[i];
        res += "L";
      }else{
        nowRight = numbers[i];
        res += "R";
      }
    }
  }
  return res;
}      
profile
어제보다 나은 오늘을 만드는 중
post-custom-banner

0개의 댓글