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

woolee의 기록보관소·2022년 11월 8일
0

알고리즘 문제풀이

목록 보기
69/178

문제 출처

프로그래머스 lev1 - 키패드 누르기

문제

나의 풀이

function solution(numbers, hand) {
  const keys = [
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9],
    ['*', 0, '#'],
  ]

  function keyArr (num) {
    for (let i=0; i<keys.length; i++) {
      for (let j=0; j<keys[i].length; j++) {
        if (num === keys[i][j]) {
          return [i,j];
        }
      }
    }
  }

  function keysDist (arr1, arr2) {
    return Math.abs(arr1[0]-arr2[0]) + Math.abs(arr1[1]-arr2[1]);
  }
  

  let answer = '';
  let leftDist = keyArr('*')
  let rightDist = keyArr('#')
  
  for (let i=0; i<numbers.length; i++) {
    if (numbers[i] == 1 || numbers[i] == 4 || numbers[i] == 7) {
      answer += 'L';
      leftDist = keyArr(numbers[i]);
    }
    else if (numbers[i] == 3 || numbers[i] == 6 || numbers[i] == 9) {
      answer += 'R';
      rightDist = keyArr(numbers[i]);
    }
    else {
      
      let Ldist = keysDist(keyArr(numbers[i]), leftDist);
      let Rdist = keysDist(keyArr(numbers[i]), rightDist);
      
      // console.log(numbers[i], keyArr(numbers[i]), leftDist, rightDist, Ldist, Rdist);

      if (Ldist > Rdist) {
        answer += 'R';
        rightDist = keyArr(numbers[i]);
      } else if (Ldist < Rdist) {
        answer += 'L';
        leftDist = keyArr(numbers[i]);
      }
      else if (Ldist === Rdist) { 
        if (hand[0].toUpperCase() === 'R') {
          answer += hand[0].toUpperCase(); 
          rightDist = keyArr(numbers[i]);
        }
        else if (hand[0].toUpperCase() === 'L') {
          answer += hand[0].toUpperCase(); 
          leftDist = keyArr(numbers[i]);
        }
        
      }
    }
  }
  return answer;
}

console.log(solution([7, 0, 8, 2, 8, 3, 1, 5, 7, 6, 2], "left"));

다른 풀이

정규표현식 [xy] ⇒ x와 y 중에 하나

RegExp.prototype.test() ⇒ 정규표현식 만족하는지 판단, true or false로 반환

function solution(numbers, hand) {
  hand = hand[0] === "r" ? "R" : "L"
  let position = [1, 4, 4, 4, 3, 3, 3, 2, 2, 2] // 얘가 뭘 의미하는거지??
  let h = { L: [1, 1], R: [1, 1] }
  return numbers.map(x => {
    if (/[147]/.test(x)) {
      h.L = [position[x], 1]
      return "L"
    }
    if (/[369]/.test(x)) {
      h.R = [position[x], 1]
      return "R"
    }
    let distL = Math.abs(position[x] - h.L[0]) + h.L[1]
    let distR = Math.abs(position[x] - h.R[0]) + h.R[1]
    if (distL === distR) {
      h[hand] = [position[x], 0]
      return hand
    }
    if (distL < distR) {
      h.L = [position[x], 0]
      return "L"
    }
    h.R = [position[x], 0]
    return "R"
  }).join("")
}

console.log(solution([7, 0, 8, 2, 8, 3, 1, 5, 7, 6, 2], "left"));
profile
https://medium.com/@wooleejaan

0개의 댓글