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

 

class Solution {
    
    int[][] keypad= {
			{1,2,3},
			{4,5,6},
			{7,8,9},
			{-1, 0, -1}
	};
	
    	// 왼손, 오른손 초기 위치
	int leftNum = -1;
	int rightNum = -1;
    
    public String solution(int[] numbers, String hand) {
        StringBuilder answer = new StringBuilder();			
				        
        for (int i = 0; i < numbers.length; i++) {
			if(numbers[i] == 1 || numbers[i] == 4 || numbers[i] == 7) { // 1,4,7 은 왼손으로 누름
				answer.append("L");
				leftNum = numbers[i];   // 왼손 위치 기록
			} else if(numbers[i] == 3 || numbers[i] == 6 || numbers[i] == 9) {  // 3,6,9 는 오른손으로 누름
				answer.append("R");
				rightNum = numbers[i];  // 오른손 위치 기록
			} else {
				answer.append(findHand(numbers[i], hand));  // 2,5,8,0 누를 손 찾기
			}
		}
        return answer.toString();
    }
    
    private String findHand(int targetNum, String hand) {
			
		int leftDist = 0;   // targetNum ~ 왼손 거리
		int rightDist = 0;  // targetNum ~ 오른손 거리

        	// 왼손, 오른손, 누를번호의 2차원 배열 상의 인덱스
		int leftIndex1 = 0;
		int leftIndex2 = 0;
		
		int rightIndex1 = 0;
		int rightIndex2 = 0;
		
		int targetIndex1 = 0;
		int targetIndex2 = 0;
		
		// 왼손의 2차원 배열 인덱스 찾기
		for (int i = 0; i < keypad.length; i++) {
			for (int j = 0; j < keypad[0].length; j++) {
				if(keypad[i][j] == leftNum) {
					leftIndex1 = i;
					leftIndex2 = j;
                    			break;
				}                
			}            
		}
		
		// 오른손의 2차원 배열 인덱스 찾기
		for (int i = 0; i < keypad.length; i++) {
			for (int j = 0; j < keypad[0].length; j++) {
				if(keypad[i][j] == rightNum) {
					rightIndex1 = i;
					rightIndex2 = j;
                    			break;
				}
			}
		}
		
		// 누를번호의 2차원 배열 인덱스 찾기
		for (int i = 0; i < keypad.length; i++) {
			for (int j = 0; j < keypad[0].length; j++) {
				if(keypad[i][j] == targetNum) {
					targetIndex1 = i;
					targetIndex2 = j;
                    			break;
				}
			}
		}
		
		leftDist = Math.abs(leftIndex1 - targetIndex1) + Math.abs(leftIndex2 - targetIndex2);   // targetNum ~ 왼손 거리
		rightDist = Math.abs(rightIndex1 - targetIndex1) + Math.abs(rightIndex2 - targetIndex2);    // targetNum ~ 오른손 거리
		        
		if(leftDist > rightDist) {  // 오른손이 가까움
			rightNum = targetNum;
			return "R";
		}			
		else if(leftDist < rightDist) { // 왼손이 가까움
			leftNum = targetNum;
			return "L";
		}			
		else {  // 거리가 같으면
			if("right".equals(hand)) {  // 오른손잡이
				rightNum = targetNum;
				return "R";
			}				
			else {  // 왼손잡이
				leftNum = targetNum;
				return "L";
			}				
		}
	}
}