본문 바로가기
Algorithm/Programmers

[프로그래머스] 키패드 누르기(2020카카오 인턴십) 자바

by YOONAYEON 2021. 11. 25.
문제

 

 

코딩테스트 연습 - 키패드 누르기

[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

 

 

 

문제 풀이

 

int[][] keypad : 키패드의 번호를 2차원 배열로 저장

int L_row, L_col : 현재 왼쪽 손이 올라가져있는 키패드 위치의 행과 열 인덱스를 담아둘 변수

int R_row, R_col : 현재 오른쪽 손이 올라가져 있는 키패드의 행렬 인덱스 값

int hand = 오른손잡이, 왼손잡이의 여부 변수를 원하는 결과값(R, L)으로 바꾸기 위한 변수 

 

 

1) 0번 열의 값들은 모두 L로 처리해야하고, 2번 열의 값들은 모두 R로 처리

2) 처리하는 동시에 왼손 오른손의 위치 인덱스도 갱신해줌

3) 1번 열의 값(가운데 값)이 들어왔을 때는 왼손과 오른손 중 어느 손의 위치가 들어온 값(target이라 칭하겠음)과 가까운지 비교

4) findHand함수 :

   - 왼손 위치와 target 위치의 행, 열 차이를 구해서 두 개를 더함

   - 오른손 위치와 target 위치의 행, 열 차이를 구해서 두 개를 더함

   - 만약 왼손의 차이가 오른손의 차이보다 더 적다면, 'L' 로 리턴. 아니라면 'R'로 리턴

   - 차이가 같다면 hand값으로 리턴

 

 

소스 코드

 

class Solution {
    static int[][] keypad = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}, {-1, 0, -2}};
    static int L_row, L_col;
    static int R_row, R_col;
    static String hand;
    
    public String solution(int[] numbers, String h) {
        String answer = "";
        L_row = 3; L_col = 0; 
        R_row = 3; R_col = 2;
        if(h.equals("right"))
            hand = "R";
        else
            hand = "L";
        
        for(int i = 0; i < numbers.length; i++){
            // 왼쪽 키패드
            if(numbers[i] == 1 || numbers[i] == 4 || numbers[i] == 7){
                L_row = findRow(0, numbers[i]);
                L_col = 0;
                answer += "L";
            }
            // 오른쪽 키패드
            else if(numbers[i] == 3 || numbers[i] == 6 || numbers[i] == 9){
                R_row = findRow(2, numbers[i]); 
                R_col = 2;
                answer += "R";
            }
            //가운데 키패드
            else{
                int t_row = findRow(1, numbers[i]);
                String a = findHand(t_row);
                answer += a;
                if(a.equals("R")){
                    R_row = t_row;
                    R_col = 1;
                }else{
                    L_row = t_row;
                    L_col = 1;
                }
            }
        }
        return answer;
    }
    
    // 열값과 숫자 넘겨주면 무슨 행인지 반환해주는 함수
    public int findRow(int col, int num){
        for(int i = 0; i < 4; i++)
            if(keypad[i][col] == num)
                return i;
        return -1;
    }
    
    // 가운데 열이 어느 손과 가까운지 반환해주는 함수
    public String findHand(int t_row){
        int L_row_distance = Math.abs(L_row - t_row);
        int L_col_distance = Math.abs(L_col - 1);
        
        int R_row_distance = Math.abs(R_row - t_row);
        int R_col_distance = Math.abs(R_col - 1);
        
        if((L_row_distance + L_col_distance) < (R_row_distance + R_col_distance))
            return "L";
        else if((L_row_distance + L_col_distance) > (R_row_distance + R_col_distance))
            return "R";
        else
            return hand;
    }
    
}