알고리즘 풀이/프로그래머스

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

데롱디롱 2021. 8. 25. 13:50
728x90
solution함수 안에 부분 보시면 됩니다!

 

 

- 각 키패드의 행렬 좌표를 저장하는 배열을 만들고,
  2,5,8,0의 입력이 들어온 경우, 왼손과 오른손에서의 거리(ld, rd)를 재어보고 더 적은 것을 선택

 

 

package com.pro.level1;

public class 키패드누르기 {

	public static void main(String[] args) {
		int[] numbers = {1, 2, 3, 4, 5, 6, 7, 8, 9, 0};
		String hand = "right";
		System.out.println(solution(numbers, hand));
	}

	public static String solution(int[] numbers, String hand) {

		// 0~9, *, # 키패드의 좌표를 저장
		int[][] keypad = { { 3, 1 }, { 0, 0 }, { 0, 1 }, { 0, 2 }, { 1, 0 }, { 1, 1 }, { 1, 2 }, { 2, 0 }, { 2, 1 },
				{ 2, 2 }, { 3, 0 }, { 3, 2 } };
		int leftHand = 10; // *
		int rightHand = 11; // #

		StringBuilder sb = new StringBuilder();
		for (int i = 0; i < numbers.length; i++) {
			int n = numbers[i];

			if (n == 1 || n == 4 || n == 7) { // 왼손 무조건
				leftHand = n;
				sb.append('L');
			} else if (n == 3 || n == 6 || n == 9) { // 오른손 무조건
				rightHand = n;
				sb.append("R");
			} else {	// 두 손의 거리 비교
				int ld = Math.abs(keypad[leftHand][0] - keypad[n][0]) + Math.abs(keypad[leftHand][1] - keypad[n][1]);
				int rd = Math.abs(keypad[rightHand][0] - keypad[n][0]) + Math.abs(keypad[rightHand][1] - keypad[n][1]);
				char dir = ld == rd ? hand.compareTo("right") == 0 ? 'r' : 'l' : ld < rd ? 'l' : 'r';

				if (dir == 'l') {
					leftHand = n;
					sb.append('L');
				} else {
					rightHand = n;
					sb.append("R");
				}
			}
		}

		return sb.toString();
	}

}