[프로그래머스]키패드 누르기

해피데빙·2022년 6월 22일
0

코딩테스트

목록 보기
18/52
post-custom-banner

문제

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

천재다 왕천재
키패드의 키 하나하나에 숫자를 주어준다
그래서 *에서 시작하는 왼손은 10, #에서 시작하는 오른손은 12, 가운데 0은 11로 값을 주고
나머지 값들의 row, col을 3의 배수에 따라 정해준다
다음에 움직일 곳이 leftNum인지 rightNum인지도 3으로 나눈 몫과 나머지에 따라서 구하낟

function solution(numbers, hand) {
  let leftNum = 10; //*
  let rightNum = 12; //#
  return numbers
    .map((num) => {
      if (num === 0) { 
        num = 11;
      }
      if (num % 3 === 1) { //1, 4, 7
        return leftTo(num);
      } else if (num % 3 === 0) { //3,6,9
        return rightTo(num);
      } else {
        const numLocation = numToLocation(num);
        const leftDistance = distanceBtwLocation(
          numToLocation(leftNum),
          numLocation
        );
        const rightDistance = distanceBtwLocation(
          numToLocation(rightNum),
          numLocation
        );
        if (leftDistance === rightDistance) {
          return hand === "left" ? leftTo(num) : rightTo(num);
        } else if (leftDistance < rightDistance) {
          return leftTo(num);
        } else {
          return rightTo(num);
        }
      }
    })
    .join("");

  function leftTo(num) {
    leftNum = num;
    return "L";
  }

  function rightTo(num) {
    rightNum = num;
    return "R";
  }
}

function numToLocation(num) { 
// col : 1을 뺀 몫(ex. 1,2,3 -> 0번째) 
// row : num-1을 하고 3으로 나눈 나머지 
  return [Math.floor((num - 1) / 3), (num - 1) % 3];
}

function distanceBtwLocation(a, b) {
  return Math.abs(a[0] - b[0]) + Math.abs(a[1] - b[1]);
}

내 풀이

function solution(numbers, hand) {
    var answer = '';

    //엄지손가락 : 상하좌우 (1)
    //왼:1,4,7
    //오: 3,6,9

    let left = [1,4,7]
    let right = [3,6,9]

    let places=[0,0]
    let pad = [[1,2,3],
               [4,5,6],
               [7,8,9],
               ['*', 0, '#']
              ]

    numbers.forEach(el => 
    { 
        if(left.includes(el)){ 
            answer+='L'
            places[0]=el
        }
        else if(right.includes(el)){ 
            answer+='R'
            places[1]=el
        }
        else{ 
            //if row가 같고 col이 1차이 
            //if col이 같고 row가 1차이 
            
            let elIdx = pad.map((p,idx) => p.includes(el) ? [idx, p.indexOf(el)] : null).filter(a => a !== null)
            let leftIdx = pad.map((p,idx) => p.includes(places[0]) ? [idx, p.indexOf(places[0])] : null).filter(a => a !== null)
            let rightIdx = pad.map((p,idx) => p.includes(places[1]) ? [idx, p.indexOf(places[1])] : null).filter(a => a !== null)

            if(Math.abs(elIdx[0] - leftIdx[0] + elIdx[1]-leftIdx[1]) === Math.abs(elIdx[0] - rightIdx[0] + elIdx[1]-rightIdx[1])){
  
                if(hand === "right"){ 
                    places[1]=el
                    answer+='R'
                }else{ 
                    places[0]=el
                    answer+='L'
                }
            }
            else if(Math.abs(elIdx[0] - leftIdx[0] + elIdx[1]-leftIdx[1]) < Math.abs(elIdx[0] - rightIdx[0] + elIdx[1]-rightIdx[1])){ 
                answer+='L'
                places[0]=el
            }
            else{ 
                answer+='R'
                places[1]=el
            }
        
        }
    })
    
    return answer

    //거리 간과
}
profile
노션 : https://garrulous-gander-3f2.notion.site/c488d337791c4c4cb6d93cb9fcc26f17
post-custom-banner

0개의 댓글