코딩테스트 문제풀이/programmers

프로그래머스 node.js - 키패드 누르기

sangchu 2024. 6. 5. 01:58

문제 링크

링크

 

풀이 과정

규칙

  • 왼손은 *, 오른손은 #에서 시작
  • 상하 좌우로만 이동 가능하고, 한 칸 거리는 1
  • 1,4,7(왼쪽 열)을 입력할때는 왼손 사용
  • 3,6,9(오른쪽 열)를 입력할 때는 오른손 사용
  • 2,5,8,0(가운데 열)을 입력할 때는 각 손가락 위치 중 해당 위치까지 거리가 가까운 손을 사용하되, 거리가 같으면 손잡이 방향인 손을 사용 

입출력

  • 입력: 순서대로 누를 번호가 담긴 배열 numbers
  • 출력: 각 번호를 누른 손가락이 왼손인지, 오른손인지 나타내는 연속된 문자열 hand

방향성

현재 위치를 표현하고 거리를 구하기 위해 좌표 개념을 활용했다.

 

누를 번호 리스트를 다 해당 좌표 배열로 변환해주었다. 

왼손 출발지는 *, 오른손 출발지는 # 이므로, 변수의 초기값으로 지정해줬다.

 

좌표로 변환한 리스트를 반복문을 통해 누른 손가락을 찾고 현재 위치를 업데이트해주며 순회했다.

 

전체 코드

function solution(numbers, hand) {
  var answer = "";
  let positions = []; // 누를 번호를 좌표로 변환한 값 리스트
  let LPos = [0, 0]; // 왼손 현재 위치
  let RPos = [2, 0]; // 오른손 현재 위치

  // 좌표 값으로 변환
  numbers.forEach((x) => {
    if (x === 7) positions.push([0, 1]);
    else if (x === 4) positions.push([0, 2]);
    else if (x === 1) positions.push([0, 3]);
    else if (x === 0) positions.push([1, 0]);
    else if (x === 8) positions.push([1, 1]);
    else if (x === 5) positions.push([1, 2]);
    else if (x === 2) positions.push([1, 3]);
    else if (x === 9) positions.push([2, 1]);
    else if (x === 6) positions.push([2, 2]);
    else if (x === 3) positions.push([2, 3]);
  });

  positions.forEach((pos) => {
    // 가운데 열일 경우 거리를 구하기 위한 각 tmp 변수
    let LTmp;
    let RTmp;

    // 왼쪽 열인 경우
    if (pos[0] === 0) {
      answer += "L";
      LPos = pos;
      // 오른쪽 열인 경우
    } else if (pos[0] === 2) {
      answer += "R";
      RPos = pos;
      // 가운데 열인 경우 -> 거리 계산
    } else if (pos[0] === 1) {
      LTmp = Math.abs(LPos[1] - pos[1]) + Math.abs(LPos[0] - pos[0]);
      RTmp = Math.abs(RPos[1] - pos[1]) + Math.abs(RPos[0] - pos[0]);

      // 오른손이 더 가까운 경우
      if (LTmp > RTmp) {
        answer += "R";
        RPos = pos;
        // 왼손이 더 가까운 경우
      } else if (LTmp < RTmp) {
        answer += "L";
        LPos = pos;
        // 거리가 가까운 경우 -> 손잡이 손으로
      } else {
        if (hand === "right") {
          answer += "R";
          RPos = pos;
        } else if (hand === "left") {
          answer += "L";
          LPos = pos;
        }
      }
    }
  });

  return answer;
}

console.log([1, 3, 4, 5, 8, 2, 1, 4, 5, 9, 5], "right");

 

 

 

풀이 시간: 41분(첫 방향성 잡는데 약 20분 소요)