[카카오 인턴] 키패드 누르기(java)

최준근·2022년 1월 12일
0

java알고리즘

목록 보기
49/63

문제설명



생각하기

  • 1,4,7일때 왼손 3,6,9 일때 오른손 그리고 2,5,8,0일때 가까운손 구하기

  • 왼손과 오른손을 저장할 변수, 왼손과 오른손의거리를 저장할 변수를 사용하기

  • *,0 ,# 을 각각 10, 11, 12로 생각하고 풀기

내 풀이

class Solution {
    public String solution(int[] numbers, String hand) {
        String ans = "";
        int lefthand = 10; // * = 10, # = 12 , 0 = 11로 본다.
        int righthand = 12;
        int Ldistance = 0; // 왼손의 거리
        int Rdistance = 0; // 오른손의 거리
        
        for(int i : numbers){
            if(i == 1 || i == 4 || i==7){
                lefthand = i;
                ans += "L";
                
            }else if(i == 3 || i == 6 || i == 9){
                righthand = i;
                ans += "R";
            }else{
                if( i  == 0 ) i = 11;
                    
                Ldistance = Math.abs(i - lefthand);
                Rdistance = Math.abs(i - righthand);
                
                if(Ldistance == 3 || Ldistance ==6 || Ldistance ==9) Ldistance /= 3; // 왼손가락 위치가 2,5,8,0일때
                else if( Ldistance == 2 ||Ldistance == 4 ) Ldistance = 2; 
                else if( Ldistance == 5 || Ldistance == 7) Ldistance = 3;
                else if( Ldistance == 8 || Ldistance ==10) Ldistance = 4;
                
                if( Rdistance == 3 || Rdistance == 6 || Rdistance ==9 ) Rdistance /= 3; // 오른손가락 위치가 2,5,8,0일때
                else if( Rdistance == 2 || Rdistance == 4) Rdistance = 2;
                else if( Rdistance == 5 || Rdistance == 7) Rdistance = 3;
                else if( Rdistance == 8 || Rdistance ==10) Rdistance = 4;
                
                
                if( Ldistance == Rdistance ){
                    if( hand.equals("right")){ 
                        righthand =i;
                        ans += "R";
                    }else{
                        lefthand = i;
                        ans += "L";
                    }
                }else if( Ldistance < Rdistance){
                    // 왼손이 더 가깝다면
                    lefthand = i;
                    ans +="L";
                }else{
                 
                    righthand = i;
                    ans += "R";   
                }
            }
        }
        return ans;
    }
}

문제를 푸는데 오랜시간이 걸렸다. 그래도 끝까지 직접 풀었다는 뿌듯함이 있었다.
먼저, lefthand와 righthand를 10, 12로 설정했다.
1,4,7과 3,6,9일땐 별다른 변수가 없기 때문에 넘어가고 만약 누르려는 숫자가 0이라면 i를 11로 바꾸어 주었다.

아래는 1,4,7의 거리를 계산한 것이다.
1일때
1-2 = -1
1-5 = -4
1-8 = -7
1-11 = -10

4일때
4-2 = 2
4-5 = -1
4-8 = 4
4-11 = 7

7일때
7-2 = 5
7-5 = 2
7-8 = -1
7-11 = -4

10(*) 일때
10-2 = 8
10-5 = 5
10-8 = 2

3,6,9를 계산해도 같은 값이 중복되어 나온다

이 값들을 Ldistance와 Rdistance에 절대값으로 저장하여 비교하고
같다면 주로 사용하는 손을, 아니면 거리가 더 짧은 손을 저장한다.

profile
느려도 좋으니 꾸준하게

0개의 댓글