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

 

 

문제 분석

- for문을 통해 입력받은 문자열만큼 처리한다.

- 마지막 키패드인 "*", "0", "#"은 거리를 구할 때 숫자로 계산하기 위해 10,11,12로 변경하여 처리한다.

- 1,4,7을 입력하는 경우 왼손으로 입력하고, 3,6,9를 입력한 경우 오른손으로 입력한다.

- 2,5,8,0(11로 처리)인 경우 두 손가락의 현재 위치와 비교하여 거리를 계산하고 가까운 손가락으로 누른다.

- 거리가 같을 경우 어느 손잡이인지 판단하고 해당 손가락으로 누른다.

- 거리는 현재 위치에서 눌러야할 키패드의 숫자를 뺀 절대값만큼 계산하고 %3한 숫자와 현재 위치에서 눌러야할 키패드의 숫자를 뺀 절대값만큼 계산하고 /3한 숫자를 더하여 구한다.

* 거리 = (Math.abs(눌러야할 키패드의 숫자-현재 손가락의 위치)%3) + (Math.abs(눌러야할 키패드의 숫자-현재 손가락의 위치)/3)

 

 

문제 풀이

1. for문을 통해 눌러야할 숫자 배열만큼 처리한다.

2. 만약 입력해야될 숫자가 1, 4, 7인 경우 왼손의 위치를 입력할 키패드의 숫자로 바꿔주고 정답에 L을 추가한다.

3. 만약 입력해야될 숫자가 3, 6, 9인 경우 오른손의 위치를 입력할 키패드의 숫자로 바꿔주고 정답에 R을 추가한다.

4. 만약 입력해야될 숫자가 2, 5, 8, 0(11로 처리)인 경우 왼손과 오른손의 거리를 계산하고 왼손이 가까운 경우 문제 풀이 2번을 처리하고, 오른손이 가까운 경우 문제 풀이 3번을 처리한다.

5. 거리가 같을 경우 오른손잡이라면 문제 풀이 3번을 처리하고, 왼손잡이라면 문제 풀이 2번을 처리한다.

6. 거리는 (Math.abs(눌러야할 키패드의 숫자-현재 손가락의 위치)%3) + (Math.abs(눌러야할 키패드의 숫자-현재 손가락의 위치)/3)의 공식을 통해 계산한다.

7. 정답을 리턴한다.

class Solution {
    static int leftLoc = 10;
    static int rightLoc = 12;  
    public String solution(int[] numbers, String hand) {
        String answer = "";
            
        int num = 0;
        int rightDis = 0;
        int leftDis = 0;

        for(int i=0;i<numbers.length;i++){
            num = numbers[i];
            
            if(num==1 || num==4 || num==7){
                leftLoc = num;
                answer += "L";
            }else if(num==3 || num==6 || num==9){
                rightLoc = num;
                answer += "R";
            }else{
                if(num==0){ // 0을 입력한 경우 
                    num=11;
                }
                rightDis = ((Math.abs(num-rightLoc))%3) + ((Math.abs(num-rightLoc))/3);
                leftDis = ((Math.abs(num-leftLoc))%3) + ((Math.abs(num-leftLoc))/3);
                
                if(leftDis<rightDis){ // 왼손이 가까울 경우
                    leftLoc = num;
                    answer += "L";
                }else if(leftDis>rightDis){ // 오른손이 가까울 경우
                    rightLoc = num;
                    answer += "R";
                }else{ // 거리가 같을 경우
                    if(hand.equals("right")){
                        rightLoc = num;
                        answer += "R";
                    }else{
                        leftLoc = num;
                        answer += "L";
                    }
                }
            }
        }
        
        return answer;
    }
    
}

 

 

https://github.com/SOEUN2/Algorithm