[プログラマー]コードテスト-[ココア実習生]キーボード(Javascript)を押す


質問する







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


に答える

function solution(numbers, hand) {
  let answer = "";
  // 전화 키패드를 2차원 배열화하여 각 인덱스 정보를 key를 통해 알아낼 수 있도록 객체로 선언
  const keys = {
    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 leftHand = keys["*"];
  let rightHand = keys["#"];

  // 눌러야 되는 키패드의 개수만큼 for문을 돈다
  for (let i = 0; i < numbers.length; i++) {
    // 현재 눌러야되는 키패드를 변수에 담는다
    const target = numbers[i];

    // 키패드가 1, 4, 7 중에 하나면 answer에 'L'을 더해주고 왼손은 방금 누른 키패드로 이동시킨다
    if (target === 1 || target === 4 || target === 7) {
      answer += "L";
      leftHand = keys[target];
    }

    // 키패드가 3, 6, 9 중에 하나면 answer에 'R'을 더해주고 오른손은 방금 누른 키패드로 이동시킨다
    else if (target === 3 || target === 6 || target === 9) {
      answer += "R";
      rightHand = keys[target];
    }

    // 키패드가 2, 5, 8, 0 중에 하나인 경우
    else {
      // L과 타겟 키패드의 거리와 R과 타겟 키패드의 거리를 위의 거리구하는 함수를 이용해 변수에 담는다
      const distanceL = getDistance(leftHand, keys[target]);
      const distanceR = getDistance(rightHand, keys[target]);

      // 왼손과의 거리가 오른손과의 거리보다 클 경우
      if (distanceR < distanceL) {
        answer += "R";
        rightHand = keys[target];
      }

      // 오른손과의 거리가 왼손과의 거리보다 클 경우
      if (distanceR > distanceL) {
        answer += "L";
        leftHand = keys[target];
      }

      // 오른손과의 거리와 왼손과의 거리가 같은 경우
      if (distanceR === distanceL) {
        // 오른손잡이일 경우
        if (hand === "right") {
          answer += "R";
          rightHand = keys[target];
        }

        // 왼손잡이일 경우
        if (hand === "left") {
          answer += "L";
          leftHand = keys[target];
        }
      }
    }
  }
  return answer;
}