코딩테스트

[코딩테스트] 2020 카카오 인턴십 - 키패드 누르기 (Javascript)

보오 2021. 11. 21. 16:23

문제 링크: https://programmers.co.kr/learn/courses/30/lessons/67256

 

코딩테스트 연습 - 키패드 누르기

[1, 3, 4, 5, 8, 2, 1, 4, 5, 9, 5] "right" "LRLLLRLLRRL" [7, 0, 8, 2, 8, 3, 1, 5, 7, 6, 2] "left" "LRLLRRLLLRR" [1, 2, 3, 4, 5, 6, 7, 8, 9, 0] "right" "LLRLLRLLRL"

programmers.co.kr

나의 풀이: https://programmers.co.kr/learn/courses/30/lessons/67256/solution_groups?language=javascript&type=my 

 

프로그래머스

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

programmers.co.kr

 

문제의 핵심: 1,4,7은 무조건 왼손, 3,6,9은 무조건 오른손, 2,5,8,0은 현재 손가락의 위치에 따라 다르게

→ 2,5,8,0을 만났을 때 왼손 엄지로부터 거리, 오른손 엄지로부터 거리를 각각 구한 후, 더 가까운 쪽이 이동하게 한다.

    만약 거리가 같다면, 왼손잡이는 왼손, 오른손잡이는 오른손으로 이동하게 한다.

 

코드로 풀어보자면

(1) 현재 손가락 위치에서 입력된 키패드의 거리를 구하는 함수 getDistance

function getDistance(posN, posL, posR) {
  let fromL = Math.abs(posN[0] - posL[0]) + Math.abs(posN[1] - posL[1]);
  let fromR = Math.abs(posN[0] - posR[0]) + Math.abs(posN[1] - posR[1]);
  return [fromL, fromR];
}

(2) 각 숫자의 위치를 행렬로 표시하기(ex: 숫자 키패드에서 1번은 [0,0]에 위치한다.)

const [one, two, three,
       four, five, six,
       seven, eight, nine,
       star, zero, hash] =
     [
      [0, 0],[0, 1],[0, 2],
      [1, 0],[1, 1],[1, 2],
      [2, 0],[2, 1],[2, 2],
      [3, 0],[3, 1],[3, 2]
     ];

(3) 입력되는 숫자별 위치를 쉽게 파악하기 위해 dials object 만들기

const dials = {
  1: one,
  2: two,
  3: three,
  4: four,
  5: five,
  6: six,
  7: seven,
  8: eight,
  9: nine,
  0: zero,
};

(4) solution 함수

function solution(numbers, hand) {
  let answer = "";
  let posL = star;
  let posR = hash;
  let lefts = [1, 4, 7];
  let rights = [3, 6, 9];
  numbers.forEach((n) => {
    let posN = dials[n]; // 번호의 위치를 구한다.

    if(lefts.includes(n)) { // 1,4,7에 해당하면 무조건 왼손(L)
      answer+="L";
      posL = posN;
    } else if(rights.includes(n)){ // 3,6,9에 해당하면 무조건 오른손(R)
      answer += "R";
      posR = posN;
    } else { // 나머지 경우 -> 직접 계산
      // 거리 구하기
      let [L, R] = getDistance(posN, posL, posR);
      if (L < R) {
        answer += "L";
        posL = posN;
      } else if (R < L) {
        answer += "R";
        posR = posN;
      } else {
        if (hand === "right") {
          answer += "R";
          posR = posN;
        } else {
          answer += "L";
          posL = posN;
        }
      }
    }
  });
  return answer;
}