키패드 누르기

» JavaScript

키패드 누르기

문제

키패드 누르기

풀이

  1. keypad에 1부터 #까지의 2차원 배열 좌표를 생성
  2. 왼, 오른손가락 위치 변수로 저장
  3. numbers의 길이만큼 반복 3으로 나눴을때 나머지가 나오면 L을 더해주고 위치 변경 나머지가 안나오면 R을 더해주고 위치 변경 둘다 아니면 equal 함수로 위치를 구함
  4. dis함수는 매개변수로 누르려는 수, 왼손의 현 위치, 오른손의 현위치, 좌표, 왼손 오른손 여부를 받는다. 현 위치에서 목표점까지 x축 y축 거리를 손마다 lh, rh에 저장한다 만약 lh, rh가 같다면 어느 손잡이인지를 확인해서 해당 손잡이를 넣어주고 같지 않다면 거리가 더 짧은 쪽을 리턴한다
function solution(numbers, hand) {
  function equal(num, lh, rh, keypad, hand) {
    const lD =
      Math.abs(keypad[lh][0] - keypad[num][0]) +
      Math.abs(keypad[lh][1] - keypad[num][1]);
    const rD =
      Math.abs(keypad[rh][0] - keypad[num][0]) +
      Math.abs(keypad[rh][1] - keypad[num][1]);

    if (lD === rD) return hand === "left" ? "L" : "R";
    return lD < rD ? "L" : "R";
  }

  // 키패드의 x, y 좌표
  const keypad = {
    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],
  };

  // 왼손 오른손의 현재 좌표 저장, 초기값 *, #
  let lh = "*",
    rh = "#";

  // 정답 넣을 변수
  let result = "";

  // for ...of으로 배열 순환
  for (let num of numbers) {
    // 나머지가 있다면 왼손 없다면 오른손
    if (num % 3 === 1) {
      result += "L"; // 정답에 추가
      lh = num; // 위치 변경
    } else if (num !== 0 && num % 3 === 0) {
      result += "R"; // 정답에 추가
      rh = num; // 위치 변경
    } else {
      // dis에 파라미터로 전달
      result += equal(num, lh, rh, keypad, hand);
      // dis로 값이 추가됬으므로 현위치 변경
      result[result.length - 1] === "L" ? (lh = num) : (rh = num);
    }
  }

  return result;
}