공부/Algorithms w.Java

프로그래머스 67256-키패드 누르기; java

thegreatjy 2021. 11. 29. 16:24
728x90
class Solution {
    public String solution(int[] numbers, String hand) {
	String answer = "";
        StringBuilder sb=new StringBuilder();	//정답 문자열
        //current[0]=10 (왼손 *), current[1]=12 (오른손 #)
        int[] current= new int[] {10, 12};	
        
        for(int i=0; i<numbers.length; i++) {
        	if(numbers[i]%3==1) {//1,4,7 왼손
        		sb.append('L');
        		current[0]=numbers[i];
        	}else if(numbers[i]%3==0 && numbers[i]!=0) {//3,6,9 오른손
        		sb.append('R');
        		current[1]=numbers[i];
        	}else {//2,5,8,0
        		if(numbers[i]==0)	numbers[i]=11;	//거리 계산을 위해 *==10, 0==11, #==12 로 변환
        		if(current[0]==0)	current[0]=11;
        		if(current[1]==0)	current[1]=11;
        		numbers[i]=numbers[i]-1;
        		int LDis=Math.abs((current[0]-1)/3-numbers[i]/3)+Math.abs((current[0]-1)%3-numbers[i]%3);
        		int RDis=Math.abs((current[1]-1)/3-numbers[i]/3)+Math.abs((current[1]-1)%3-numbers[i]%3);

        		if(LDis==RDis) {
        			if(hand.equals("right")) {
        				sb.append('R');
        				current[1]=numbers[i]+1;
        			}else {
        				sb.append('L');
        				current[0]=numbers[i]+1;
        			}
        		}else if(LDis<RDis){
        			sb.append('L');
    				current[0]=numbers[i]+1;
        		}else {	//LD>RD
        			sb.append('R');
    				current[1]=numbers[i]+1;
        		}
        	}
        }
        answer=sb.toString();
        return answer;
    }
}

 

numbers[i]가

1) 1,4,7->L

2) 3,6,9->R

3) 2,5,8,0

현재 숫자인 num[i]과 왼쪽손가락과의 거리 LDis, 오른쪽 손가락과의 거리 RDis를 구해서 더 작은 거리를 가진 쪽을 선택한다.

3-1) 거리 구하기

키패드를 123/456/789/*0# -> 012/345/678/9 10 11 이렇게 바꾸어준다.

 

0     1     2

(0,0) (0,1) (0,2)

3     4     5

(1,0) (1,1) (1,2)

6     7     8

(2,0) (2,1) (2,2)

9     10    11

(3,0) (3,1) (3,2)

 

(n/3, n%3)을 통해, 위와 같이 (층, 열)을 나타낸다. 

|층 차이|+|열 차이|는 두 키패드의 거리이다.

728x90