[프로그래머스] 키패드 누르기

fsm12·2023년 7월 8일
0

프로그래머스

목록 보기
32/57
post-thumbnail

문제링크

문제 이해

[ 입력형태 / 조건 ]

numbers
순서대로 누를 번호가 담긴 배열 | [1, 3, 4, 5, 8, 2, 1, 4, 5, 9, 5] | 배열의 크기는 1 이상 1,000 이하, 원소의 값은 0 이상 9 이하인 정수

hand
왼손잡이인지 오른손잡이인 지를 나타내는 문자열 | "right" | "left" 또는 "right"

[ 문제 ]

각 번호를 누른 엄지손가락이 왼손인 지 오른손인 지를 나타내는 연속된 문자열 형태로 return

[ 풀이 ]

2,5,8,0의 좌표를 Map에 저장하고, 왼손과 오른손이 2,5,8,0까지의 거리를 계산하여 ans에 추가



코드

> [성공] 1차 시도 : 구현, Map 이용

  • 생각한 풀이 그대로 구현
import java.util.*;

class Solution {
    public String solution(int[] numbers, String hand) {
        StringBuilder sb = new StringBuilder();
        
        int[] leftHand = new int[]{3,0}, rightHand = new int[]{3,2};
        boolean handFlag = hand.equals("right")?true:false;
        
        Map<Integer, int[]> mid = new HashMap<>();
        for(int m : new int[]{2,5,8,11}){
            mid.put(m==11?0:m, new int[]{m/3, 1});
        }
        
        for(int num : numbers){
            if(num == 1 || num == 4 || num == 7){
                leftHand = new int[]{num/3, 0};
                sb.append("L");
            }else if(num == 3 || num == 6 || num == 9){
                rightHand =  new int[]{num/3-1, 2};
                sb.append("R");
            }else{
                int[] midXY = mid.get(num);
                int leftToMid = Math.abs(midXY[0] - leftHand[0]) + Math.abs(midXY[1] - leftHand[1])
                    , rightToMid = Math.abs(midXY[0] - rightHand[0]) + Math.abs(midXY[1] - rightHand[1]);
                if(leftToMid == rightToMid){
                    if(handFlag){
                        rightHand = midXY;
                        sb.append("R");
                    }else{
                        leftHand = midXY;
                        sb.append("L");
                    }
                }else if(leftToMid < rightToMid){
                    leftHand = midXY;
                    sb.append("L");
                }else{
                    rightHand = midXY;
                    sb.append("R");
                }
            }
        }
        return sb.toString();
    }
}



Tip : 구현문제에서 각 기능별로 메뉴판처럼 함수를 만들어 놓는 것이 가독성에 좋다.

0개의 댓글