알고리즘 문제 풀기

프로그래머스: 키패드 누르기 - javasript(구현, Math.abs, 숫자 규칙)

Fo_rdang 2024. 4. 6. 13:02
반응형

문제 출처 

https://school.programmers.co.kr/learn/courses/30/lessons/67256

 

프로그래머스

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

programmers.co.kr

 

문제 풀이 힌트 

- 키패드를 그래프로 표현하기 

- 현재 손가락 위치 계속 체크  

- 주어진 숫자랑, 왼손 오른손과의 거리를 구하는 함수 
- 왼쪽일때 (1,3,7), 오른쪽일때(3,6,9), 가운데일때(2,5,8,0) 행위 구분 

 

문제 풀이 코드 

function solution(numbers, hand) {
    // 결과 문자열을 저장할 변수
    let answer = '';
    
    // 두 손가락의 위치와 목표 숫자의 위치를 받아, 두 손가락의 거리를 계산하고 
    // 가까운 손가락을 반환하는 함수
    function dis(lH, rH, num, pos) {
        // 왼손가락과 목표 숫자 간의 거리 계산
        const leftDis = Math.abs(pos[lH][0] - pos[num][0]) + Math.abs(pos[lH][1] - pos[num][1]);
        // 오른손가락과 목표 숫자 간의 거리 계산
        const rightDis = Math.abs(pos[rH][0] - pos[num][0]) + Math.abs(pos[rH][1] - pos[num][1]); 
        
        // 거리가 같을 경우, 사용자의 손잡이(hand) 선호에 따라 반환
        if (leftDis === rightDis) return hand === 'left' ? 'L' : 'R'; 
        // 왼손가락이 가까운 경우 'L', 오른손가락이 가까운 경우 'R'을 반환
        return leftDis < rightDis ? 'L' : 'R';
    }
    
    // 키패드의 각 숫자 위치를 저장하는 객체
    const pos = {
        '1': [0,0], '2': [0,1], '3': [0,2], 
        '4': [1,0], '5': [1,1], '6': [1,2], 
        '7': [2,0], '8': [2,1], '9': [2,2],
        '*': [3,0], '0': [3,1], '#': [3,2]
    };
    
    // 초기 왼손가락 위치는 '*'에, 오른손가락 위치는 '#'에 둔다
    let lH = '*', rH = '#'; 
    
    // 입력된 숫자 배열을 순회하면서 각각의 숫자에 대해 처리
    for (let num of numbers) {
        if (num % 3 === 1) { // 숫자가 1, 4, 7 중 하나인 경우
            answer += 'L'; // 왼손으로 누름
            lH = num; // 왼손가락의 위치를 현재 숫자로 업데이트
        } else if (num % 3 === 0 && num !== 0) { // 숫자가 3, 6, 9 중 하나인 경우
            answer += 'R'; // 오른손으로 누름
            rH = num; // 오른손가락의 위치를 현재 숫자로 업데이트
        } else { // 숫자가 2, 5, 8, 0 중 하나인 경우
            let temp = dis(lH, rH, num, pos); // 두 손가락과 숫자 간의 거리 비교
            answer += temp; // 가까운 손가락을 결과 문자열에 추가
            // 가까운 손가락의 위치를 현재 숫자로 업데이트
            temp === 'L' ? lH = num : rH = num; 
        }
    }
    return answer; // 결과 문자열 반환
}

 

Only 풀이 코드 

function solution(numbers, hand) {
    let answer = '';
    
    function dis(lH, rH, num, pos){
       const leftDis = Math.abs(pos[lH][0] - pos[num][0]) + Math.abs(pos[lH][1] - pos[num][1]);
       const rightDis = Math.abs(pos[rH][0] - pos[num][0]) + Math.abs(pos[rH][1] - pos[num][1]); 
       
       if (leftDis === rightDis) return hand === 'left' ? 'L' : 'R'; 
       return leftDis < rightDis ? 'L' : 'R'
    }
    
   const pos = {
        '1':[0,0] , '2':[0,1] , '3': [0,2], 
        '4':[1,0] , '5':[1,1] , '6': [1,2], 
        '7':[2,0] , '8':[2,1] , '9': [2,2],
        '*':[3,0] , '0':[3,1] , '#': [3,2]
    }
    
    let lH = '*', rH='#'; 
    
    for(let num of numbers){
        if(num%3 === 1){
            answer+='L'; 
            lH = num; 
        }else if(num%3 === 0 && num !== 0){
            answer+='R'
            rH = num; 
        }else{
            let temp = dis(lH, rH, num, pos);
            answer += temp; 
            temp === 'L' ? lH = num : rH = num; 
        }
    }
    return answer; 
}

 

반응형