티스토리 뷰

programmers.co.kr/learn/courses/30/lessons/67256?language=java

 

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

[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

import java.util.Arrays;
import java.util.List;

class Solution {
    public String solution(int[] numbers, String hand) {
        
        List<Integer> leftPushList = Arrays.asList(1,4,7); 
    	List<Integer> rightPushList = Arrays.asList(3,6,9);
    	List<Integer> anyPushList = Arrays.asList(2,5,8,0);
    	StringBuilder builder = new StringBuilder();
    	
    	// * : 10
    	// # : 12
    	int nowLeftFinger =  10;
    	int nowRightFinger = 12;
    	
    	for(int num : numbers) {
    		if(leftPushList.contains(num)) {
    			builder.append("L");
    			nowLeftFinger = num;
    		}
    		
    		if(rightPushList.contains(num)) {
    			builder.append("R");
    			nowRightFinger = num;
    		}
    		
    		if(anyPushList.contains(num)) {
    			if(num == 0) {
    				num = 11;
    			}
    			
    			int leftTemp = Math.abs(nowLeftFinger - num);
    			int rightTemp = Math.abs(nowRightFinger - num);
    			
    			int distanceByLeftFinger = leftTemp / 3 + leftTemp % 3;
    			int distanceByRightFinger = rightTemp / 3 + rightTemp % 3;
    			
    			if(distanceByLeftFinger > distanceByRightFinger) {
    				nowRightFinger = num;
    				builder.append("R");
    			} else if (distanceByLeftFinger < distanceByRightFinger) {
    				nowLeftFinger = num;
    				builder.append("L");
    			} else {    				
    				if(hand.equals("left")) {
        				nowLeftFinger = num;
        				builder.append("L");
    				} else {
        				nowRightFinger = num;
        				builder.append("R");    					
    				}
    			}
    		}
    	}
        return builder.toString();
    }
}

키패드를 하나의 표로 생각해서 문제를 해결했다.

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

맨 아래 행은 *, 0, # 이라서 계산이 어려우니 10, 11, 12로 거리계산 전에 치환해줬다.

1행부터 보면 아래로 갈수록 +3씩 되는 것을 볼 수 있다.

따라서 +3 혹은 -3은 한칸의 행 움직임이 된다.

예를들면, 9번 -> 3번으로 이동시

9 - 3 = 6

6 / 3 = 2

아래로 2칸 이동이라는 결과가 나온다.

3번 -> 9번 이동시에는 음수가 되는데 어디로 이동했는지는 알 필요없으니 절대값으로 음수 양수 구분을 없애준다.

그럼 열에 대한 구분은 어떻게 해야할까?

열은 나머지로 구하면 된다.

같은 행 숫자의 차이는 +3 / -3 이므로 3으로 나누면 나머지는 항상 0이 된다.

다른 열로 이동하면 나머지는 1, 두번이동하면 나머지는 2가 된다.

예를들어 9번 -> 2번으로 이동시 9 - 2 = 7 % 3 = 1... 옆으로 한칸 이동했다고 나온다.

행과 열의 거리를 계산했으니 이를 비교해 가운데 라인의 숫자(2,5,8,0)를 어떤 손꾸락으로 누를지만 구분해주면 끝!

댓글