개요

순서대로 누를 번호가 담긴 배열 numbers, 왼손잡이인지 오른손잡이인 지를 나타내는 문자열 hand가 매개변수로 주어질 때, 각 번호를 누른 엄지손가락이 왼손인 지 오른손인 지를 나타내는 연속된 문자열 형태로 return 하도록 solution 함수를 완성해주세요.

 

키패드를 누르는데 어느 손으로(왼손, 오른손) 눌렀는지를 순서대로 만들어 return하면 된다

이때 중간 2580에 있는 숫자들은 가까운 키패드를 눌렀던 손이 누르고 만약 길이가 같다면 왼손잡이인지 오른손 잡이인지에 따라 누르면 된다

 

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr


풀이

왼손 오른손 기준으로 키보드 배열을 만들어줬다

 

numbers로 주어진 배열을 돌면서 조건은 가운데 2580에 포함되는 숫자인지 아닌지를 찾았다

만약 포함되지 않는다면 왼쪽 오른쪽을 찾아서 넣어줬고 포함된다면 어느 손으로 눌러야할지를 구한다

 

이전에 각 손이 어딜 눌렀는지를 저장하기 위해서 lh와 rh를 만들어뒀고 이후 주어진 자판보다 얼마나 떨어져있는지 상대길이를 구하기 위해 findIndex 함수를 만들어 절대값으로 return 해줬다.

 

이때 주의해야할 점이 가운데 배열이 아닌 왼쪽, 오른쪽 자판을 마지막으로 터치한 경우 가운데 자판과 거리를 구할 때 각각 위, 아래(키패드상 좌 우)로 한칸씩은 무조건 움직여야하지만 마지막을 가운데 자판으로 터치한 경우 움직일 필요가 없으니 그 부분만 구분해줬다

 

이후 거리를 비교해서 answer에 추가

 

function solution(numbers, hand) {
  let answer = "";
  let lh = 999;
  let rh = 999;

  const keyboard = [
    [1, 4, 7, 999],
    [2, 5, 8, 0],
    [3, 6, 9, 999],
  ];

  const len = numbers.length;

  function findIndex(ci, target) {
    for (let i = 0; i < 3; i++) {
      const check = keyboard[i].indexOf(target);
      if (check !== -1) {
        // 가운데 있는 수가 아니면 움직일 때 +1 값이 늘어난다
        return i === 1 ? Math.abs(ci - check) : Math.abs(ci - check) + 1;
      }
    }
  }

  for (let i = 0; i < len; i++) {
    const num = numbers[i];
    if (keyboard[1].includes(num)) {
      // 가운데 있을떄
      const ci = keyboard[1].indexOf(num);
      const li = findIndex(ci, lh);
      const ri = findIndex(ci, rh);

      // li와 ri가 같다면
      if (li === ri) {
        if (hand === "right") {
          rh = num;
          answer += "R";
        } else {
          lh = num;
          answer += "L";
        }
      }
      // li가 더 작다면(가깝다면)
      else if (li < ri) {
        lh = num;
        answer += "L";
      }
      // ri가 더 작다면(가깝다면)
      else {
        rh = num;
        answer += "R";
      }
    }
    // 가운데 숫자가 아니라면
    else {
      if (keyboard[0].includes(num)) {
        answer += "L";
        lh = num;
      } else {
        answer += "R";
        rh = num;
      }
    }
  }
  return answer;
}

 

 

복사했습니다!