키패드 누르기

김현민·2021년 9월 17일
0

Algorithm

목록 보기
86/126
post-thumbnail


// 키패드 가운데 번확 있을 경우 거리비교하는 함수
function dist(input, left, right, hand) {
  const pad = [
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9],
    ["*", 0, "#"],
  ]

  let target = []
  let leftIndex = []
  let rightIndex = []

  for (let i = 0; i < pad.length; i++) {
    for (let j = 0; j < pad[i].length; j++) {
      if (input === pad[i][j]) {
        target.push(i)
        target.push(j)
      }
      if (left === pad[i][j]) {
        leftIndex.push(i)
        leftIndex.push(j)
      }
      if (right === pad[i][j]) {
        rightIndex.push(i)
        rightIndex.push(j)
      }
    }
  }
  
  const leftDist =
    Math.abs(leftIndex[0] - target[0]) + Math.abs(leftIndex[1] - target[1])

  const rightDist =
    Math.abs(rightIndex[0] - target[0]) + Math.abs(rightIndex[1] - target[1])

  if (rightDist > leftDist) {
    return "L"
  } else if (rightDist < leftDist) {
    return "R"
  } else if (rightDist === leftDist) {
    if (hand === "right") return "R"
    else return "L"
  }
}


function solution(numbers, hand) {
  let res = ""
  let left = "*"
  let right = "#"
  for (let i = 0; i < numbers.length; i++) {
    if (
      numbers[i] === 1 ||
      numbers[i] === 4 ||
      numbers[i] === 7 ||
      numbers[i] === "*"
    ) {
      res += "L"
      left = numbers[i]
    } else if (
      numbers[i] === 3 ||
      numbers[i] === 6 ||
      numbers[i] === 9 ||
      numbers[i] === "#"
    ) {
      res += "R"
      right = numbers[i]
    } else if (
      numbers[i] === 2 ||
      numbers[i] === 5 ||
      numbers[i] === 8 ||
      numbers[i] === 0
    ) {
      const temp = dist(numbers[i], left, right, hand)
      if (temp === "L") {
        left = numbers[i]
        res += temp
      } else {
        right = numbers[i]
        res += temp
      }
    }
  }

  var answer = res
  return answer
}

solution([1, 2, 3, 4, 5, 6, 7, 8, 9, 0], "right")
  1. 1,4,7,* 인 경우 무조건 'L'을 추가

  2. 3,6,9,# 인 경우 무조건 'R'을 추가

  3. 키패드 가운데인 경우 target번호인 numbers[i],
    현재 누르고 있는 left,right,
    같을 경우 반환에 필요한 값인 hand 들을 dist함수에 매개변수로 넣는다.

  4. 매개변수 각각의 인덱스를 구하고, (x1-x2) + (y1-y2)값을 구하면 target번호까지의 거리를 구할 수 있다. left, right 각각 비교한 후 L 또는 R을 반환한다.
    같은 경우는 hand를 참고해서 반환한다.

profile
Jr. FE Dev

0개의 댓글