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

Jo Chang Uk·2024년 6월 5일
post-thumbnail

1.문제

문제 링크

2.풀이

2.1 생각해 볼 만한 케이스

  • 왼손, 오른손 구분
  • 중간일때 거리 계산
  • 거리 계산후 같을 경우 왼손잡이, 오른손 잡이 구분

2.2 거리 계산

예전에 풀었던 백준 20436번 : ZOAC3 문제(문제 링크)가 생각 나는 문제 였습니다.
거리 계산은 |x1-x2|+|y1-y2|로 계산 했습니다.

function distancePostion(num, num2) {
  return Math.abs(num[0] - num2[0]) + Math.abs(num[1] - num2[1]);
}

2.3 키패드

키패드
배열로 만들었습니다.

let keypad = [
  [1, 2, 3],
  [4, 5, 6],
  [7, 8, 9],
  ["*", 0, "#"],
];

2.4 제출 코드

// 오른쪽인지 확인하는 함수
function isRight(num) {
  if (num === 3 || num === 6 || num === 9) return true;
  else false;
}
// 왼쪽인지 확인하는 함수
function isLeft(num) {
  if (num === 1 || num === 4 || num === 7) return true;
  else false;
}
// 키패드
let keypad = [
  [1, 2, 3],
  [4, 5, 6],
  [7, 8, 9],
  ["*", 0, "#"],
];
// 좌표화 해주는 함수
function convertToCoordinates(num) {
  for (let i = 0; i < keypad.length; i++) {
    for (let j = 0; j < keypad[0].length; j++) {
      if (num === keypad[i][j]) return [i, j];
    }
  }
}
// 거리를 반환해주는 함수
function getDistance(num, num2) {
  return Math.abs(num[0] - num2[0]) + Math.abs(num[1] - num2[1]);
}

function solution(numbers, hand) {
  var answer = "";
  // 초기 왼손, 오른손 position
  let lp = [3, 0];
  let rp = [3, 2];
  for (let num of numbers) {
    if (isRight(num)) {
      // 오른쪽 일때
      answer += "R";
      rp = convertToCoordinates(num);
    } else {
      if (isLeft(num)) {
        // 왼쪽 일때
        answer += "L";
        lp = convertToCoordinates(num);
      } else {
        // 중간 일때
        let nump = convertToCoordinates(num);
        if (getDistance(nump, lp) === getDistance(nump, rp)) {
          if (hand === "right") {
            answer += "R";
            rp = convertToCoordinates(num);
          } else {
            answer += "L";
            lp = convertToCoordinates(num);
          }
        } else {
          if (getDistance(nump, lp) > getDistance(nump, rp)) {
            answer += "R";
            rp = convertToCoordinates(num);
          } else {
            answer += "L";
            lp = convertToCoordinates(num);
          }
        }
      }
    }
  }
  return answer;
}

0개의 댓글