[Programmers level1] 키패드 누르기

박지호·2022년 8월 23일

출처 : https://school.programmers.co.kr/learn/courses/30/lessons/67256

문제


접근 방식

  • 키패드의 *, 0, #을 각각 10, 11, 12로 취급한다.
  • 누를 손을 판단해야 하는 경우([2, 5, 8, 0]을 누르는 경우)에 거리를 계산하여 판단
  • 거리 계산식 => ( (누를 번호 - 왼손의 위치) / 3 + (누를 번호 - 오른손의 위치) % 3 ) 의 절댓값
  • 거리가 같을 때에는 왼손잡이, 오른손잡이 확인하여 판단

코드

class Solution {
    public String solution(int[] numbers, String hand) {
        String answer = "";
        int lh = 10, rh = 12;
        StringBuilder sb = new StringBuilder();
        for(int i = 0; i < numbers.length; i++){
            switch (numbers[i]){
                case 1: case 4: case 7:
                    sb.append("L");
                    lh = numbers[i];
                    break;
                case 3: case 6: case 9:
                    sb.append("R");
                    rh = numbers[i];
                    break;
                default:
                    int number = numbers[i] == 0 ? 11 : numbers[i];
                    String use = getHand(number, lh, rh, hand);
                    if(use.equals("L")){
                        lh = number;
                    } else if (use.equals("R")) {
                        rh = number;
                    }
                    sb.append(use);
                    break;
            }
        }
        answer = sb.toString();
        return answer;   
    }
    
    private String getHand(int number, int lh, int rh, String hand) {
        int left = Math.abs((number - lh) / 3 + (number - lh) % 3);
        int right = Math.abs((number - rh) / 3 + (number - rh) % 3);
        String use = "";
        if(left == right){
            use = hand.equals("left") ? "L" : "R";
        } else if (left > right) {
            use = "R";
        } else if (left < right){
            use = "L";
        }
        return use;
    }
}
profile
제발 돼라

0개의 댓글