프로그래머스(Level1-5) 키패드 누르기

LEE ·2022년 2월 2일
0

문제 설명
스마트폰 전화 키패드의 각 칸에 다음과 같이 숫자들이 적혀 있습니다.


구현코드:

class Solution {
    public String solution(int[] numbers, String hand) {
        StringBuffer as =new StringBuffer();
        int left = 10;	 
		int right = 12;
        for(int number : numbers){
            if(number == 1 || number == 4 || number == 7){
                as.append("L");
                left=number;
            }else if(number == 3 || number == 6 || number == 9){
                 as.append("R");
                right=number;
            }else{
                int leftLength = length(left,number);
                int rightLength = length(right,number);
    
                if(leftLength > rightLength) {
					as.append("R");
					right = number;
				} else if(leftLength < rightLength) {
					as.append("L");
					left = number;
				} else {
					if(hand.equals("right")) {
						as.append("R");
						right = number;
					} else {
						as.append("L");
						left = number;
					}
				}
            }
        }
        String answer = as.toString();
        return answer;
    }
    
    public int length(int index,int number){
       
		index = (index == 0) ? 11 : index;	
		number = (number == 0) ? 11 : number;
        
        int x = (index - 1) / 3;
        int y = (index - 1) % 3;
		int numberX = number / 3;
		int numberY = 1;

		return Math.abs(x-numberX) + Math.abs(y-numberY);
    }
}

문제 해설:
lett 값은 무조건 왼손이 rigth 값은 무조건 오른손이 하게되고 center 값이 왼손이 할지 오른손이 할지를 구하는 문제이다.
문제를 풀기위해서는 키패드를 좌표라고 생각한 후 2,5,8,0에 대해 현재 위치해있는 왼손,오른손의좌표와의 거리의 차를 구해 더 가까이에있는 손이 키패드를 눌어야한다.

leftcenterright
row1123
row2456
row3789
row4*0#

우선 좌표로 바꿔본다면 이렇게 표현할 수있다.

leftcenterright
row11[0][0]2[0][1]3[0][2]
row24[1][0]5[1][1]6[1][2]
row37[2][0]8[2][1]9[2][2]
row4*[3][0]0[3][1]#[3][2]

그러면 숫자,문자에 대해서 좌표로 나타내야하는데 어떻게 식으로 나타낼 수있을까?
x 좌표는 (숫자-1)/3
y좌표를 (숫자-1)%3 이라고 표현 할 수있다. 그러면 *,0,#은 어떡할 것인가? 답은 간단하다 10,11,12 라고 생각 하면 된다.

0개의 댓글

Powered by GraphCDN, the GraphQL CDN