본문 바로가기
문제 풀이/Programmers

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

by Electrohyun 2025. 7. 8.

 


 

생각 과정

 

1. 왼쪽 열의 1 4 7은 반드시 왼손, 오른쪽 열의 3 6 9는 반드시 오른손으로 입력한다.

 

2. result는 let result = ""로 값을 할당하고, 계산한 결과로 나온 L 혹은 R을 +해준다.

 

3. "두 손가락의 거리가 같다면" = 거리를 계산하고, if문으로 이를 비교할 필요가 있다.

 

function findPos(num, phone, hand) {
  if (hand === "left") {
    for (let i = 0; i < 3; i++) {
      if (phone[i][0] === num) return [i, 0];
    }
  }

  if (hand === "right") {
    for (let i = 0; i < 3; i++) {
      if (phone[i][2] === num) return [i, 2];
    }
  }
}

function solution(numbers, hand) {
  const phone = [
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9],
    ['*', 0, '#']
  ];
  const middleColumn = [2, 5, 8, 0];
  let answer = '';
  let leftPos = [3, 0];
  let rightPos = [3, 2];
  
  for(let i = 0; i < numbers.length; i++) {
    let target = numbers[i];

    if([1, 4, 7].includes(target)) { 
      leftPos = findPos(target, phone, "left");
      answer += "L";
      continue;
    }

    if([3, 6, 9].includes(target)) { 
      rightPos = findPos(target, phone, "right"); 
      answer += "R";
      continue;
    }

    const depth = middleColumn.indexOf(target);
    const leftDist = Math.abs(leftPos[0] - depth) + Math.abs(leftPos[1] - 1);
    const rightDist = Math.abs(rightPos[0] - depth) + Math.abs(rightPos[1] - 1);

    if (leftDist < rightDist) {
      leftPos = [depth, 1];
      answer += "L";
    } else if (leftDist > rightDist) {
      rightPos = [depth, 1];
      answer += "R";
    } else {
      if (hand === "left") {
        leftPos = [depth, 1];
        answer += "L";
      } else {
        rightPos = [depth, 1];
        answer += "R";
      }
    }
  }

  return answer;
}

 

 

알게 된 것들

 

1. let보다 const로 작성한 상수의 순서가 앞서는 것이(위에 있는 것이) 컨벤션 상 적합하다.

 

2. const depth = middleColumn.indexOf(target) 으로 배열을 매회 순회하고 있는데...

const depth = target === 0 ? 3 : Math.floor((target - 1) / 3);와 같이 작성해주면

배열 인덱스가 3을 넘지 않으므로 depth에 값을 효율적으로 할당할 수 있다.