알고리즘

프로그래머스 : 키패드 누르기 (Java)

만년다딱2 2021. 5. 8. 19:45

1. 문제링크

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

2. 접근방법

숫자 패드를 1차원 배열

{0, 0}, {0, 1}, {0, 2}, {1, 0}......{3, 2}로 만들어서 차이의 절대값을 계산하여 가까운 위치를 찾아주었다.

 

3. 코드

class Solution {
    public String solution(int[] numbers, String hand) {
       String answer = "";
		int phone[][] = {{},{0, 0}, {0, 1}, {0, 2},
						  {1, 0}, {1, 1}, {1, 2},
						  {2, 0}, {2, 1}, {2, 2},
						  {3, 0}, {3, 1}, {3, 2}};
		int lastL[] = {3, 0};
		int lastR[] = {3, 2};
		for (int i = 0; i < numbers.length; i++) {
			if(numbers[i] == 1 || numbers[i] == 4 || numbers[i] == 7) {
				answer += "L";
				if(numbers[i] == 1)
					lastL = phone[1];
				if(numbers[i] == 4)
					lastL = phone[4];
				if(numbers[i] == 7)
					lastL = phone[7];
			}
			else if(numbers[i] == 3 || numbers[i] == 6 || numbers[i] == 9) {
				answer += "R";
				if(numbers[i] == 3)
					lastR = phone[3];
				if(numbers[i] == 6)
					lastR = phone[6];
				if(numbers[i] == 9)
					lastR = phone[9];
			}
				
			else {
				int temp[] = null;
				if( numbers[i] == 2 )
					temp = phone[2];
				else if( numbers[i] == 5 )
					temp = phone[5];
				else if( numbers[i] == 8 )
					temp = phone[8];
				else if( numbers[i] == 0 )
					temp = phone[11];
				int distL = Math.abs(lastL[0] - temp[0]) + Math.abs(lastL[1] - temp[1]);
				int distR = Math.abs(lastR[0] - temp[0]) + Math.abs(lastR[1] - temp[1]);
				System.out.println(numbers[i] + " " + distL + " " + distR);
				
				if(distL > distR) {
					lastR = temp;
					answer += "R";
				} else if(distL < distR) {
					lastL = temp;
					answer += "L";
				} else {
					if(hand.equals("left")) {
						answer += "L";
						lastL = temp;
					} else {
						answer += "R";
						lastR = temp;
					}
				}
			}
		}
		return answer;
    }
}

 

4. 마치며

코드를 조금 더 꼼꼼하게 보아야 겠다....

answer += 해준 이후에 나머지 코드들을 자세하게 보지 않아 시간이 조금 더 걸렸다.

시뮬레이션은 항상 꼼꼼하게 봐주기!