본문 바로가기
알고리즘/문제풀이

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

by 겅아링 2021. 8. 23.
반응형

 

 

 

 

 

풀이>

키패드를 2차원 배열로 구성한다
  1       2       3
[0,0]   [0,1]   [0,2]
  4       5       6
[1,0]   [1,1]   [1,2]
  7       8       9
[2,0]   [2,1]   [2,2]
  *       0       #
[3,0]   [3,1]   [3,2]

배열 구성을... 보이는대로 거꾸로 적용하였는데
손가락의 위치와의 키패드의 거리를 구하기 위해 구현한 것이라 문제 없을 것 같다!
ex) 1 => [3,0]  / 2 => [3,1]  / 3 => [3,2]
     4 => [2,0] 

1,4,7 은 왼손
3,6,9 는 오른손 누른것을 추가해주고,
2,5,8,0은 현재 왼손,오른손의 위치와 키패드와의 거리를 계산
거리 차이가 적은 손을 답에 추가하고
거리가 같다면 , 어느 손잡이인지 검사 후(문제에서 주어지는 hand) 추가.

 

public class Programmers17 {
	public static void main(String[] args) {
     //테스트용 입력 정의
		int[] numbers = { 7, 0, 8, 2, 8, 3, 1, 5, 7, 6, 2 };
		String hand = "left";
		
		String answer="";

		String[][] keyPad = { { "1", "2", "3" }, 
        				{ "4", "5", "6" }, 
        				{ "7", "8", "9" }, 
        				{ "*", "0", "#" } };
		
		//시작 손 위치 
		int[] left = { 3, 0 };
		int[] right = { 3, 2 };

		for (int i = 0; i < numbers.length; i++) {
			for (int j = 0; j < keyPad.length; j++) {
            	//현재 눌러야 하는 번호
				String curNumString = String.valueOf(numbers[i]);
				if (curNumString.equals(keyPad[j][0])) {
					// 1,4,7
					answer+="L";
					
					//왼손가락 위치저장
					left[0] = j;
					left[1] = 0;
					break;
				} else if (curNumString.equals(keyPad[j][2])) {
					// 3,6,9
					answer+="R";
					
					//오른손가락 위치저장
					right[0] = j;
					right[1] = 2;
					break;
				} else if (curNumString.equals(keyPad[j][1])) {
					// 2,5,8,0
					//왼손의 이동거리
					int l = Math.max(left[0], j) - Math.min(left[0], j) 
                    		+ Math.max(left[1], 1) - Math.min(left[1], 1);
					
					//오른손의 이동거리
					int r = Math.max(right[0], j) - Math.min(right[0], j) 
                    		+ Math.max(right[1], 1)
							- Math.min(right[1], 1);
					
					//이동거리가 짧은 손, 이동거리가 같다면 어느손잡이인지 확인 후 해당 손 이동
					String moveHand=l > r ? "R" : l == r ? hand.equals("right") ? "R" : "L" : "L";
					answer+=moveHand;
					
					//이동후 손가락 위치 저장
					if (moveHand.equals("L")) {
						left[0] = j;
						left[1] = 1;
					} else {
						right[0] = j;
						right[1] = 1;
					}
					break;
				} else {
					continue;
				}
			}
		}

		//System.out.println(answer);
        return answer;
	}

}
반응형