본문으로 바로가기

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

 

문제의 핵심은 아래와 같다. 이 문제는 가장 핵심 규칙인 좌표값에 최소거리를 어떻게 구할것인가?

각 좌표의 x값 y값의 절대값의 합이 거리를 나타내는 규칙을 알면 풀 수 있는 문제다. 마찬가지로 4x4 배열 5x5 배열의 경우에는 3으로 나누는 것이 아닌 4, 5로 나눠 해당 좌표를 구할 수 있다. 여기서 해당 키패드 숫자를 -1 해주는것도 잊으면 안된다. 앞으로 좌표를 활용한 알고리즘에서도 유용하게 쓰일 것 같다. 

  1. 키패드는 순서대로 문제에 나와있는 사진과같이 1,2,3,4,5,6,7,8,9,*,0,# 순서로 있다.
  2. (1,4,7) 일때는 무조건 왼손을 사용하고, (3,6,9) 일때는 무조건 오른손을 사용하고, 현재 Left,Right의 위치를 갱신한다.
  3. 시작 위치는 왼손은 *(키패드 상으로 10번째) , 오른손은 #(키패드 상으로 12번째)
  4. 문제는 (2,5,8,0) 인데 여기서 규칙을 찾는것이 가장 중요하다.

->규칙 (키패드-1) / 3 은 X 좌표, (키패드-1) % 3 은 Y 좌표를 구할 수 있다.

5. 키패드 0은 11로 바꿔줘야한다. (0의 좌표는 (3,1))
6. 마지막으로, L또는 R이 위치한 좌표와 누르려는 키패드(n) 의 차이를 구한다

 

 

class Solution {
    public static String solution(int[] numbers, String hand) {
		
		StringBuffer sb = new StringBuffer();
		int leftHand = 10;
		int rightHand = 12;
		
		for(int num : numbers) {
			if(num == 1 || num == 4 || num == 7) {
				sb.append("L");
				leftHand = num;
			}else if(num == 3 || num == 6 || num == 9) {
				sb.append("R");
				rightHand = num;
			}else {
				int distL = getDist( num, leftHand);
				int distR = getDist( num, rightHand);
				
				if( distL > distR) {
					sb.append("R");
					rightHand = num;
				}else if(distL == distR){
					if(hand =="right") {
						sb.append("R");
						rightHand = num;
					}else {
						sb.append("L");
						leftHand = num;
					}
				}else if(distL < distR) {
					sb.append("L");
					leftHand = num;
				}
			}
		}
		
		return sb.toString();
	}
	
	/**
	 * @param num
	 * @param hand
	 * @return
	 */
	private static int getDist( int num, int hand ) {
		
		if(num == 0) num = 11;
		if(hand == 0) hand = 11;
		
		int numx = (num-1) / 3;
		int numy = (num-1) % 3;
		int handx = (hand-1) / 3;
		int handy = (hand-1) % 3;
		
		int dist = Math.abs(numx - handx) + Math.abs(numy - handy);
		return dist;
	}
}

해당 답안을 IDE에서 실행하면 잘 동작하지만, 이상하게 프로그래머스 답안 제출 시 첫번째 케이스가 답이 올바르게 나오지 않는다..왤까??