본문 바로가기
Algorithm/PROGRAMMERS[Java]

Lv1. 키패드 누르기[카카오]

by 씨니 2022. 5. 1.
728x90

▶ 문제

 

▶ 풀이방법

- 첫번째 풀이방법

--> (현재값 - 눌러야 하는 값)을 3으로 나눈 몫과 나머지를 더하면 이동해야하는 키패드 칸의 거리가 나옴.

class Solution {
    public String solution(int[] numbers, String hand) {
        String answer = "";
        int left = 10; //*은 10으로
        int right = 12; //#은 12로
        
        for(int i = 0; i < numbers.length; i++){
            if(numbers[i] == 0) numbers[i] = 11; // 0은 10으로 인식
            if(numbers[i] == 1 || numbers[i] == 4 || numbers[i] == 7) {
                answer += "L";
                left = numbers[i];
            }
            else if(numbers[i] == 3 || numbers[i] == 6 || numbers[i] == 9) {
                answer += "R";
                right = numbers[i];
            }
            else{
                int lnum = Math.abs(left-numbers[i]);//Math.abs()는 절대값 함수
                int rnum = Math.abs(right-numbers[i]);
                int l = lnum%3 + lnum/3; //왼손이 이동해야하는 거리
                int r = rnum%3 + rnum/3; //오른손이 이동해야하는 거리
                
                //왼손 오른손 이동해야하는 거리 값 비교
                if(l == r){
                    if(hand.equals("right")){
                        answer += "R";
                        right = numbers[i];
                    }else{
                        answer += "L";
                        left = numbers[i];
                    }
                }else if(l > r){
                    answer += "R";
                    right = numbers[i];
                }else{
                    answer += "L";
                    left = numbers[i];
                }
            }
        }
        
        return answer;
    }
}

위의 코드는 (현재값-눌러야 하는값)을 3으로 나눠 몫과 나머지를 더한다는것을 다른사람 풀이글에서 알게되어서 풀어서 작성한 코드. 

(머리를 조금만 더 굴려보자..!!ㅜㅜ)

 

- 두번째 풀이방법

- 키패드를 배열이라 생각하고 푸는 방법

- 첫번째 풀이방법보다 속도↑

 

class Solution {
    public String solution(int[] numbers, String hand) {
        String answer = "";
        int[] left = {3,0}; //* 배열 위치
        int[] right = {3,2}; //# 배열 위치
        
        //0~9까지의 위치 배열로 저장
        int[][] key ={{3,1},{0,0},{0,1},{0,2},{1,0},{1,1},{1,2},{2,0},{2,1},{2,2}};
        
        for(int i = 0; i < numbers.length; i++){
            int num = numbers[i];
            
            if(num == 1 || num == 4 || num == 7){
                left[0] = key[num][0];
                left[1] = key[num][1];
                answer += "L";
            }else if(num == 3 || num == 6 || num == 9){
                right[0] = key[num][0];
                right[1] = key[num][1];
                answer += "R";
            }else{
                int l = Math.abs(left[0] - key[num][0]) + Math.abs(left[1] - key[num][1]);
                int r = Math.abs(right[0] - key[num][0]) + Math.abs(right[1] - key[num][1]);
                
                if(l == r){
                    if(hand.equals("left")){
                        left[0] = key[num][0];
                        left[1] = key[num][1];
                        answer += "L";
                    }else{
                        right[0] = key[num][0];
                        right[1] = key[num][1];
                        answer += "R";
                    }
                }else if(l > r){
                    right[0] = key[num][0];
                    right[1] = key[num][1];
                    answer += "R";
                }else{
                    left[0] = key[num][0];
                    left[1] = key[num][1];
                    answer += "L";
                }
            }
        }
        
        return answer;
    }
}
728x90