알고리즘

[카카오 인턴] 키패드 누르기 - java

minkang 2021. 4. 30. 22:23

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 {
	public String solution(int[] numbers, String hand) {
		int phone[][] = new int[12][2];
		// 폰 넘버의 좌표
		for (int i = 1; i <= 9; i++) {
			phone[i][0] = (i - 1) / 3 + 1;
			phone[i][1] = i % 3 == 0 ? 3 : i%3;
		}
		phone[0][0] = 4;
		phone[0][1] = 2;
		phone[10][0] = 4;
		phone[10][1] = 1;
		phone[11][0] = 4;
		phone[11][1] = 3;
		
		int leftNumber = 10;
		int rightNumber = 11;
		StringBuilder sb = new StringBuilder();
		for (int i = 0; i < numbers.length; i++) {
			if(numbers[i] == 1 || numbers[i] == 4 || numbers[i] == 7) {
				leftNumber = numbers[i];
				sb.append("L");
				continue;
			}
			else if( numbers[i] == 3 || numbers[i] == 6 || numbers[i] == 9) {
				rightNumber = numbers[i];
				sb.append("R");
				continue;
			}
			
			int left = distance(numbers[i], leftNumber, phone);
			int right = distance(numbers[i], rightNumber, phone);
			if(left == right) {
				if(hand.equals("left")) {
					leftNumber = numbers[i];
					sb.append("L");
				}
				else {
					rightNumber = numbers[i];
					sb.append("R");
				}
			}
			else if(left < right) {
				leftNumber = numbers[i];
				sb.append("L");
			}
			else {
				rightNumber = numbers[i];
				sb.append("R");
			}
		}

		String answer = sb.toString();
		return answer;
	}

	private int distance(int number, int prevNumber, int[][] phone) {
		return Math.abs(phone[number][0] - phone[prevNumber][0]) +Math.abs(phone[number][1]- phone[prevNumber][1]);
	}

}

phone 배열에 각 번호의 좌표를 담고 로직에 맞게 구현했습니다.