프로그래머스 카카오 인턴 – 키패츠 누르기 문제

  1. 문제
자세한 문제는 ( https://programmers.co.kr/learn/courses/30/lessons/67256 ) 참고!

2. 내가 푼 해답

const keypad = [
  [1, 2, 3],
  [4, 5, 6],
  [7, 8, 9],
  ['*', 0, '#'],
];

const solution = (numbers, hand) => {
  const answer = [];
    
  let left_hand = [3, 0];
  let right_hand = [3, 2];
    
  const numbers_index = numbers.map((num) => {
    let index;
    for (let i = 0; i < keypad.length; i++) {
      for (let j = 0; j < keypad[0].length; j++) {
        if (num === keypad[i][j]) {
          index = [i, j];
          break;
        }
      }
    }
    return index;
  });
    
  numbers_index.forEach((index) => {
    if (index[1] === 0) {
      answer.push('L');
      left_hand = index;
    } else if (index[1] === 2) {
      answer.push('R');
      right_hand = index;
    } else {
      let left_distance = Math.abs(index[0] - left_hand[0]) + Math.abs(index[1] - left_hand[1]);
      let right_distance = Math.abs(index[0] - right_hand[0]) + Math.abs(index[1] - right_hand[1]);
      if (left_distance === right_distance) {
        if (hand == 'left') {
          answer.push('L');
          left_hand = index;
        } else {
          answer.push('R');
          right_hand = index;
        }
      } else if (left_distance > right_distance) {
        answer.push('R');
        right_hand = index;
      } else {
        answer.push('L');
        left_hand = index;
      }
    }
  });
  return answer.join('');
};
  1. numbers를 keypad의 인덱스와 일치한 배열을 선언한다.
  2. 위에서 선언한 배열을 돌면서, 왼손과 오른손이 명백할 경우 그리고 그 외의 경우를 나누어서 로직을 세운다

1번 인덱스의 수가 0일 경우는 왼손, 2일 경우는 오른손을 이동시키고, 1일 경우엔 위치 계산을 해서 더 가까운 쪽을 이동시키면 된다.

카카오 문제는 어렵진 않은데 문제를 이해하는 과정이 좀 어렵다. 독해력을 키워야 할 것 같다.

Leave a comment

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다