프로그래머스 Lv.1 : 키패드 누르기

zeroequaltwo·2022년 12월 1일
0

코딩테스트

목록 보기
59/69

문제

프로그래머스 문제

내 풀이

  • 두 지점 간의 거리를 구하기 위해 좌표방식을 사용했다.
function solution(n, h) {
    let pad = [[2,4],[1,1],[2,1],[3,1],[1,2],[2,2],[3,2],[1,3],[2,3],[3,3]];
    let answer = "";
    let left = [1,4];
    let right = [3,4];
    
    for(var i=0; i<n.length; i++){
        if(n[i] === 1 || n[i] === 4 || n[i] === 7){
            answer += "L";
            left = pad[n[i]];
        } else if(n[i] === 3 || n[i] === 6 || n[i] === 9){
            answer += "R"; 
            right = pad[n[i]];
        } else {
            let dl = Math.abs(left[0] - pad[n[i]][0]) + Math.abs(left[1] - pad[n[i]][1]);
            let dr = Math.abs(right[0] - pad[n[i]][0]) + Math.abs(right[1] - pad[n[i]][1]);
            if(dl < dr){
                answer += "L";
                left = pad[n[i]];
            } else if(dr < dl){
                answer += "R";
                right = pad[n[i]];                
            } else {
                answer += h.toUpperCase()[0];
                if(h === "left") left = pad[n[i]];
                else right = pad[n[i]];        
            }
        }
    }
    
    return answer;
}

개선점

  • test()를 활용해서 조건문을 길게 안 쓸 수 있다.
function solution(numbers, hand) {
  hand = hand[0] === "r" ? "R" : "L"
  let position = [1, 4, 4, 4, 3, 3, 3, 2, 2, 2]
  let h = { L: [1, 1], R: [1, 1] }
  return numbers.map(x => {
    if (/[147]/.test(x)) {
      h.L = [position[x], 1]
      return "L"
    }
    if (/[369]/.test(x)) {
      h.R = [position[x], 1]
      return "R"
    }
    let distL = Math.abs(position[x] - h.L[0]) + h.L[1]
    let distR = Math.abs(position[x] - h.R[0]) + h.R[1]
    if (distL === distR) {
      h[hand] = [position[x], 0]
      return hand
    }
    if (distL < distR) {
      h.L = [position[x], 0]
      return "L"
    }
    h.R = [position[x], 0]
    return "R"
  }).join("")
}
profile
나로 인해 0=2가 성립한다.

0개의 댓글