기록하는 개발자

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

Algorithm

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

밍맹030 2022. 5. 3. 23:00
728x90

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

 

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

[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

 

1 2 3
4 5 6
7 8 9
* 0 #

 

1. 맨 처음 왼손 엄지손가락은 * 키패드에 오른손 엄지손가락은 # 키패드 위치에서 시작

→ '*' 키패드를 10, '0' 키패드를 11, ''#'키패드를 12로 간주한다.

→ Left와 Right의 값을 최초 초기화 할 때 각각 10과 12로 한다.

 

2-1. 누를 번호가 0 인경우 누를 번호를 11로 변경한다.(거리 계산을 위해)

2-2. 누를 번호를 3으로 나눈 나머지가 1이면 왼손, 0이면 오른손, 2이면 가까운 손으로 누른다.

각 키패드 간의 거리 계산 방법
 ((현재번호-누를번호/3))+((현재번호-누를번호%3))

[ 예시 ] 
Left = 1 Right = 6 n= 8

오른손과 누를 번호 사이의 거리
= ((6-8/3))+((6-8%3)) = 2 + 0 = 2

왼손과 누를 번호 사이의 거리
= ((1-8/3))+((1-8%3)) = 1 + 2 = 3

→ 왼손과의 거리가 더 가깝기 때문에 왼손으로 키패드를 누른다.

3. 누를 손가락이 정해지면 해당 키패드의 번호로 right 또는 left 값을 초기화한다.

 

class Solution {
    public String solution(int[] numbers, String hand) {
        StringBuilder sb = new StringBuilder();
        int left=10, right=12;
        int LDistance, RDistance;
        
        for(int n : numbers) {
            LDistance = 0; RDistance = 0;
            if(n == 1 || n == 4 || n == 7) {
                sb.append("L");
                left = n;
			
            }
            else if(n == 3 || n == 6 || n == 9) {
                sb.append("R");
                right = n;
            }
            else {
                if(n==0) n += 11;
                LDistance = (Math.abs(n-left))/3 + (Math.abs(n-left))%3;
                RDistance = (Math.abs(right-n))/3 + (Math.abs(right-n))%3;
                if(LDistance == RDistance) {
                    if(hand.equals("right")) {
                        sb.append("R");
                        right = n;
                    }
                    else {
                        sb.append("L");
                        left = n;
                    }
				}
                else if(LDistance > RDistance) {
                    sb.append("R");
                    right = n;
                }
                else {
                    sb.append("L");
                    left = n;
                }
            }
        }	
        return sb.toString();
    }
}
728x90