Java/프로그래머스

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

동구름이 2024. 5. 31. 21:33

문제

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

 

프로그래머스

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

programmers.co.kr

 


풀이

구현 문제입니다. 우선 키패드 간의 거리는 행렬 격자 상에 있다고 가정했습니다.

 

키패드를 누를 때마다 현재 left, right의 위치가 갱신됩니다. 그리고 다음 번호와 left, right의 거리를 비교해야합니다.

 

저는 각 번호를 행렬의 열과 행으로 바꾸어준 뒤,  Math.abs(r1-r2)+Math.abs(c1-c2)의 식을 통해 거리를 계산했습니다.

 

 해당 번호를 각각의 행과 열로 표현하기 위해서  mod 연산과 나머지 연산을 이용했습니다. 그리고 예외적인 0과 *, # 는 따로 처리를 해줍니다. 

 

 주의해야할 것은 두 손가락의 시작 위치가 기본적으로 세팅되어있다는 것입니다.

 

 아래는 소스 코드입니다.

 


소스 코드

class Solution {
    public String solution(int[] numbers, String hand) {
        String answer = "";
        
        int left = -1;
        int right = -2;
        
        for(int i = 0;i<numbers.length;i++){
            int number = numbers[i];
            if(number == 1||number == 4||number == 7){
                left = number;
                answer+="L";
            }
            else if(number == 3||number == 6||number == 9){
                right = number;
                answer+="R";
            }
            else{
                if(getDistance(number, left)<getDistance(number, right)){
                    left = number;
                    answer+="L";
                }
                else if(getDistance(number, left)>getDistance(number, right)){
                    right = number;
                    answer+="R";
                }
                else{
                    if(hand.equals("left")){
                        left = number;
                        answer+="L";
                    }
                    else{
                        right = number;
                        answer+="R";
                    }
                }
            }
        }
        return answer;
    }
    
    static int getDistance(int number, int finger){
        int r = (number-1)/3;
        int c = (number-1)%3;
        if(number == 0){
            r=3;
            c=1;
        }
        int fingerR = (finger-1)/3;
        int fingerC = (finger-1)%3;
        if(finger == -1){
            fingerR=3;
            fingerC=0;
        }
        if(finger == -2){
            fingerR=3;
            fingerC=2;
        }
        if(finger == 0){
            fingerR=3;
            fingerC=1;
        }
        return Math.abs(r-fingerR)+Math.abs(c-fingerC);
    }
}