끄적끄적 코딩일지

[Programmers]키페드 누르기(난이도:★★★★★★) 본문

알고리즘

[Programmers]키페드 누르기(난이도:★★★★★★)

BaekGyuHyeon 2022. 5. 17. 09:16

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

class Solution {
    public String solution(int[] numbers, String hand) {
        boolean isRight = hand.equals("right");
        return solutionA(numbers,0,isRight,"",10,12);
    }
    // 제귀함수 사용
    public String solutionA(int[] numbers,int idx,boolean right,String current,int rPosition,int lPosition ){
    // number index 값이 1, 4, 7 이면 L 붙이고 현제 왼손 위치에 number index 값 저장
        if(numbers[idx] == 1 || numbers[idx]== 4 || numbers[idx] == 7){
            current +="L";
            lPosition = numbers[idx];
            // number index 값이 3, 6, 9 이면 R 붙이고 현제 오른손 위치에 number index 값 저장
        }else if(numbers[idx] == 3 || numbers[idx] == 6|| numbers[idx] == 9){
            current +="R";
            rPosition = numbers[idx];
        }else{
            // 거리 구하는 공식
            // 두 숫자를 빼고 3으로 나누면 몪은 상하 이동, 나머지 값은 좌우 혹은 상하 이동 거리가 된다.
            int rdis = Math.abs((rPosition == 0?11:rPosition) - (numbers[idx] == 0?11:numbers[idx]));
            int ldis = Math.abs((lPosition == 0?11:lPosition) - (numbers[idx] == 0?11:numbers[idx]));
            int rmove = (rdis / 3) + (rdis % 3);
            int lmove = (ldis / 3) + (ldis % 3);
            if(rmove > lmove){
                current+="L";
                lPosition = numbers[idx];
            }else if(rmove < lmove){
                current+="R";
                rPosition = numbers[idx];
            }else{
                if(right){
                    current+="R";
                    rPosition = numbers[idx];
                }else{
                    current+="L";
                    lPosition = numbers[idx];
                }
                
            }
            
                
        }
        // 만약 idx가 마지막 값이면 return
        // 아니면 다시 제귀함수 실행
        if(idx == numbers.length -1)
            return current;
        else
            return solutionA(numbers,++idx,right,current,rPosition,lPosition);
    }
}