알고리즘 연습

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

코딩하는 너구리 2020. 7. 31. 23:19
반응형

 

출처 : https://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

 

 

키패드 누르기

문제 설명

스마트폰 전화 키패드의 각 칸에 다음과 같이 숫자들이 적혀 있습니다.

 

![kakao_phone1.png](https://grepp-programmers.s3.ap-northeast-2.amazonaws.com/files/production/4b69a271-5f4a-4bf4-9ebf-6ebed5a02d8d/kakao_phone1.png)

이 전화 키패드에서 왼손과 오른손의 엄지손가락만을 이용해서 숫자만을 입력하려고 합니다. 맨 처음 왼손 엄지손가락은 `*` 키패드에 오른손 엄지손가락은 `#` 키패드 위치에서 시작하며, 엄지손가락을 사용하는 규칙은 다음과 같습니다.

 

  1. 엄지손가락은 상하좌우 4가지 방향으로만 이동할 수 있으며 키패드 이동 한 칸은 거리로 1에 해당합니다.

  2. 왼쪽 열의 3개의 숫자 `1`, `4`, `7`을 입력할 때는 왼손 엄지손가락을 사용합니다.

  3. 오른쪽 열의 3개의 숫자 `3`, `6`, `9`를 입력할 때는 오른손 엄지손가락을 사용합니다.

  4. 가운데 열의 4개의 숫자 `2`, `5`, `8`, `0`을 입력할 때는 두 엄지손가락의 현재 키패드의 위치에서 더 가까운 엄지손가락을 사용합니다. 4-1. 만약 두 엄지손가락의 거리가 같다면, 오른손잡이는 오른손 엄지손가락, 왼손잡이는 왼손 엄지손가락을 사용합니다.

     

순서대로 누를 번호가 담긴 배열 numbers, 왼손잡이인지 오른손잡이인 지를 나타내는 문자열 hand가 매개변수로 주어질 때, 각 번호를 누른 엄지손가락이 왼손인 지 오른손인 지를 나타내는 연속된 문자열 형태로 return 하도록 solution 함수를 완성해주세요.

 

**[제한사항]**

  • numbers 배열의 크기는 1 이상 1,000 이하입니다.

  • numbers 배열 원소의 값은 0 이상 9 이하인 정수입니다.

  • hand는 "left" 또는 "right" 입니다.

    • `"left"`는 왼손잡이, `"right"`는 오른손잡이를 의미합니다.

  • 왼손 엄지손가락을 사용한 경우는 `L`, 오른손 엄지손가락을 사용한 경우는 `R`을 순서대로 이어붙여 문자열 형태로 return 해주세요.


 

**입출력 예**

[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"`

**입출력 예에 대한 설명**

 

**입출력 예 #1**

순서대로 눌러야 할 번호가 [1, 3, 4, 5, 8, 2, 1, 4, 5, 9, 5]이고, 오른손잡이입니다.

왼손 위치오른손 위치눌러야 할 숫자사용한 손설명

* # 1 L 1은 왼손으로 누릅니다.
1 # 3 R 3은 오른손으로 누릅니다.
1 3 4 L 4는 왼손으로 누릅니다.
4 3 5 L 왼손 거리는 1, 오른손 거리는 2이므로 왼손으로 5를 누릅니다.
5 3 8 L 왼손 거리는 1, 오른손 거리는 3이므로 왼손으로 8을 누릅니다.
8 3 2 R 왼손 거리는 2, 오른손 거리는 1이므로 오른손으로 2를 누릅니다.
8 2 1 L 1은 왼손으로 누릅니다.
1 2 4 L 4는 왼손으로 누릅니다.
4 2 5 R 왼손 거리와 오른손 거리가 1로 같으므로, 오른손으로 5를 누릅니다.
4 5 9 R 9는 오른손으로 누릅니다.
4 9 5 L 왼손 거리는 1, 오른손 거리는 2이므로 왼손으로 5를 누릅니다.
5 9 - -  

따라서 `"LRLLLRLLRRL"`를 return 합니다.

**입출력 예 #2**

왼손잡이가 [7, 0, 8, 2, 8, 3, 1, 5, 7, 6, 2]를 순서대로 누르면 사용한 손은 `"LRLLRRLLLRR"`이 됩니다.

**입출력 예 #3**

오른손잡이가 [1, 2, 3, 4, 5, 6, 7, 8, 9, 0]를 순서대로 누르면 사용한 손은 `"LLRLLRLLRL"`이 됩니다.

 

import java.util.Map;
import java.util.HashMap;

class Solution {
    public String solution(int[] numbers, String hand) {
        Map<String, Integer> map = new HashMap<>();
		map.put("12", 1);
		map.put("15", 2);
		map.put("18", 3);
		map.put("10", 4);

		map.put("22", 0);
		map.put("25", 1);
		map.put("28", 2);
		map.put("20", 3);

		map.put("32", 1);
		map.put("35", 2);
		map.put("38", 3);
		map.put("30", 4);

		map.put("42", 2);
		map.put("45", 1);
		map.put("48", 2);
		map.put("40", 3);

		map.put("52", 1);
		map.put("55", 0);
		map.put("58", 1);
		map.put("50", 2);

		map.put("62", 2);
		map.put("65", 1);
		map.put("68", 2);
		map.put("60", 3);

		map.put("72", 3);
		map.put("75", 2);
		map.put("78", 1);
		map.put("70", 2);

		map.put("82", 2);
		map.put("85", 1);
		map.put("88", 0);
		map.put("80", 1);

		map.put("92", 3);
		map.put("95", 2);
		map.put("98", 1);
		map.put("90", 2);

		map.put("*2", 4);
		map.put("*5", 3);
		map.put("*8", 2);
		map.put("*0", 1);

		map.put("02", 3);
		map.put("05", 2);
		map.put("08", 1);
		map.put("00", 0);

		map.put("#2", 4);
		map.put("#5", 3);
		map.put("#8", 2);
		map.put("#0", 1);

		StringBuilder sb = new StringBuilder();
		String left = "*";
		String right = "#";

		for (int i = 0; i < numbers.length; i++) {
			String ch = "" + numbers[i];
			if (ch.equals("1") || ch.equals("4") || ch.equals("7")) {
				sb.append("L");
				left = ch;
			} else if (ch.equals("3") || ch.equals("6") || ch.equals("9")) {
				sb.append("R");
				right = ch;
			} else {
				String leftTemp = left;
				String rightTemp = right;
				
				int leftDist = map.get(left+ch);
				int rightDist = map.get(right + ch);
				
				if(leftDist > rightDist) {
					sb.append("R");
					right = ch;
				} else if (leftDist < rightDist) {
					sb.append("L");
					left = ch;
				} else {
					if(hand.equals("left")) {
						sb.append("L");
						left = ch;
					} else {
						sb.append("R");
						right = ch;
					}
				}
			}
		}
		
		return sb.toString();
    }
}

 

 

문제가 잘 풀리지 않아 거의 노가다 하다시피 풀이하여 추천드리지 않습니다...

 

해쉬맵에 현재 위치에서 다음 번호까지의 거리를 모두 저장해두었습니다.

 

손이 이동하면 움직인 위치를 left 또는 right에 저장해두고 다음번 키패드까지의 거리를 계산하였습니다.

 

반응형