[프로그래머스/키패드 누르기] JavaScript

윤상일·2022년 7월 17일
0

프로그래머스 Lv.1

목록 보기
12/15
post-thumbnail

문제 설명

순서대로 누를 번호가 담긴 배열 numbers, 왼손잡이인지 오른손잡이인 지를 나타내는 문자열 hand가 매개변수로 주어질 때, 각 번호를 누른 엄지손가락이 왼손인 지 오른손인 지를 나타내는 연속된 문자열 형태로 return 하도록 solution 함수를 완성해주세요.
자세한 설명은 아래의 링크를 클릭해주세요.
https://school.programmers.co.kr/learn/courses/30/lessons/67256

나의 코드

function solution(numbers, hand) {
    var answer = '';
    var button = [1,2,3,4,5,6,7,8,9,'*',0,'#'];
    var map = new Map();
    var row=0;
    
    for(var i=0; i<button.length; i++){ // 버튼의 위치를 버튼을 키값으로 위치를 저장
        if((i!=0) && (i%3===0)) row++;
        map.set(button[i],[row,i%3]);    
    }
  
    var L_position = '*'; // 왼손가락의 현위치
    var R_position = '#'; // 오른손가락의 현위치
    
    for(var i=0; i<numbers.length; i++){  //numbers배열을 순회
        if(numbers[i]%3===1){ // 왼손가락으로 클릭할 경우
            answer += 'L';
            L_position = numbers[i]; //현위치 변경
        }
        else if((numbers[i]%3===0) && (numbers[i] != 0)){ //오른손가락으로 클릭할 경우
            answer += 'R'; 
            R_position = numbers[i]; //현위치 변경
        }
        else{ //눌러야할 숫자가 2,5,8,0일 경우
            var L_distance = Math.abs(map.get(L_position)[0]-map.get(numbers[i])[0])
                            + Math.abs(map.get(L_position)[1]-map.get(numbers[i])[1]);
            var R_distance = Math.abs(map.get(R_position)[0]-map.get(numbers[i])[0])
                            + Math.abs(map.get(R_position)[1]-map.get(numbers[i])[1]);
           //각 숫자 각각의 행의 위치와 열의 위치의 차의 절댓값끼리의 합이 거리가 된다.
          //거리 검사 후 거리 비교후 버튼 클릭.
            if(L_distance > R_distance){
                answer += 'R';
                R_position = numbers[i];
            }
            else if(L_distance < R_distance){
                answer += 'L';
                L_position = numbers[i];
            }
            else{ // 거리가 같은경우 주손 검사
               if(hand==="left"){
                   answer += 'L';
                    L_position = numbers[i];
               }
                else{
                    answer += 'R';
                    R_position = numbers[i];
                }
                
            }
        }
    }

    
    return answer;
}

1. 문제 풀이

var L_distance = Math.abs(map.get(L_position)[0]-map.get(numbers[i])[0])
                            + Math.abs(map.get(L_position)[1]-map.get(numbers[i])[1]);
var R_distance = Math.abs(map.get(R_position)[0]-map.get(numbers[i])[0])
                            + Math.abs(map.get(R_position)[1]-map.get(numbers[i])[1]);
아마 이 부분이 설명이 필요할거 같다.
밑의 표를 보면 #의 위치는 [1,1]이고 %의 위치는 [2,2]이다. 그렇다면 표에서 이 두 문자의 거리는
절댓값(%의 행의위치 - #의 행의위치) + 절댓값(%의 열의위치 - #의 열의위치) 의 결과값이
거리가 나오게 된다. 왜냐하면 행의위치의 차의 절댓값은 두 문자의 세로거리이고
열의 차의 절댓값을 가로거리이기 때문이다.
이를 핸드폰 키보드 위치에 대입해보면 위 코드가 이해가 갈것이다.
|#|$|
|@|%|


profile
멋있는 개발자를 꿈꾸는 코린이

0개의 댓글