Development Logs/Algorithms

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

유뱅유뱅뱅 2020. 9. 7. 19:24

programmers.co.kr/learn/courses/30/lessons/67256?language=java

 

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

[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

그냥 구현 문제 입니다. 문제에 주어진 조건에 맞춰 풀면 되는 문제이다.

해결 방안

문제 조건

키패드의 위치를 x, y로 생각해주었다.
00~02
..
30~32

1. 일단 문제의 조건4에서 2,5,8,0 숫자 키패드가 나온경우 두 엄지손가락의 현재 키패드 위치에서 더 가까운 엄지 손가락을 사용한다고 하였으므로 왼손, 오른손 엄지의 위치를 저장할 변수를 선언해주었다.(lLoc, rLoc)
(이때, lLoc(왼손 엄지 위치)의 초깃값은 * 키패드의 위치인 {3,0}으로 rLoc(왼손 엄지 위치)의 초깃값은 # 키패드의 위치인 {3,2}로 설정해주었다.)

2. 각 숫자 패드의 위치를 ArrayList<int[]> locList에 저장해주었다. (locList.get(i) 하면 i 키패드의 위치가 나올 수 있게)

3. 조건2, 조건3과 같이 147, 369가 나온경우 각각 왼손 위치, 오른손 위치를 저장해주고 answer에는 L, R을 추가해준다.

4. 조건 4같이 2580이 나온경우 왼, 오른손과의 거리를 구해주고 더 가까운 손을 answer에 추가해준다.
이때 같으면 hand에 영향을 받도록 구현하였다.

 

(자세한 것은 코드의 주석 참고!)

 

코드

import java.util.*;
// 키패드 누르기
class Solution {
    
    // 00~02
    // ..
    // 30~32
    static int[] lLoc = {3, 0}; // 왼 엄 위치(*)
    static int[] rLoc = {3, 2}; // 오 엄 위치(#)
    static List<int[]> locList = new ArrayList<>();
    
    public String solution(int[] numbers, String hand) {
        String answer = "";
        
        int x = 0;
        int y = 0;
        // 0~9 키패드 위치 저장
        for(int i=0; i<=9; i++){
            if(i==0) 
                locList.add(new int[]{3,1});
            else{
                locList.add(new int[]{x, y});
                y++;
                if(y % 3 == 0){
                    y = 0;
                    x++;
                }
            }
        }
        
        // 가운데 패드와 왼, 오른 엄지손가락 거리
        int lDistance = 0;
        int rDistance = 0;
        StringBuilder sb = new StringBuilder();
        for(int i=0; i<numbers.length; i++){
            // 147
            if(numbers[i] == 1 || numbers[i] == 4 || numbers[i] == 7){
                sb.append("L");
                lLoc = locList.get(numbers[i]);
            }
            // 369
            else if(numbers[i] == 3 || numbers[i] == 6 || numbers[i] == 9){
                sb.append("R");
                rLoc = locList.get(numbers[i]);
            }
            // 2580
            else{
                // 거리 계산
                lDistance = Math.abs(lLoc[0]-locList.get(numbers[i])[0]) + Math.abs(lLoc[1]-locList.get(numbers[i])[1]);
                rDistance = Math.abs(rLoc[0]-locList.get(numbers[i])[0]) + Math.abs(rLoc[1]-locList.get(numbers[i])[1]);
                
                // 거리가 같으면 손잡이 따라감
                if(lDistance == rDistance){
                    if(hand.equals("right")){
                        sb.append("R");
                        rLoc = locList.get(numbers[i]);
                    }
                    else if(hand.equals("left")){
                        sb.append("L");
                        lLoc = locList.get(numbers[i]);
                    }
                }
                // 왼쪽
                else if(lDistance < rDistance){
                    sb.append("L");
                    lLoc = locList.get(numbers[i]);
                }
                // 오른쪽
                else if(rDistance < lDistance){
                    sb.append("R");
                    rLoc = locList.get(numbers[i]);
                }
            }
            
        }
        answer = new String(sb);
            
        return answer;
    }
}