[프로그래머스 / JAVA] Level 1 키패드 누르기 (67256)
⏰ 2021-12-14 (화) 12:46:59
키패드 누르기
랭크 | 사용 언어 |
---|---|
Level 1 |
문제 설명
스마트폰 전화 키패드의 각 칸에 다음과 같이 숫자들이 적혀 있습니다.
이 전화 키패드에서 왼손과 오른손의 엄지손가락만을 이용해서 숫자만을 입력하려고 합니다.
맨 처음 왼손 엄지손가락은 *
키패드에 오른손 엄지손가락은 #
키패드 위치에서 시작하며, 엄지손가락을 사용하는 규칙은 다음과 같습니다.
- 엄지손가락은 상하좌우 4가지 방향으로만 이동할 수 있으며 키패드 이동 한 칸은 거리로 1에 해당합니다.
- 왼쪽 열의 3개의 숫자 1, 4, 7을 입력할 때는 왼손 엄지손가락을 사용합니다.
- 오른쪽 열의 3개의 숫자 3, 6, 9를 입력할 때는 오른손 엄지손가락을 사용합니다.
- 가운데 열의 4개의 숫자 2, 5, 8, 0을 입력할 때는 두 엄지손가락의 현재 키패드의 위치에서 더 가까운 엄지손가락을 사용합니다.
- 만약 두 엄지손가락의 거리가 같다면, 오른손잡이는 오른손 엄지손가락, 왼손잡이는 왼손 엄지손가락을 사용합니다.
순서대로 누를 번호가 담긴 배열 numbers
, 왼손잡이인지 오른손잡이인 지를 나타내는 문자열 hand
가 매개변수로 주어질 때, 각 번호를 누른 엄지손가락이 왼손인 지 오른손인 지를 나타내는 연속된 문자열 형태로 return 하도록 solution
함수를 완성해주세요.
제한사항
numbers
배열의 크기는 1 이상 1,000 이하입니다.numbers
배열 원소의 값은 0 이상 9 이하인 정수입니다.hand
는 "left" 또는 "right" 입니다.- "left"는 왼손잡이, "right"는 오른손잡이를 의미합니다.
- 왼손 엄지손가락을 사용한 경우는 L, 오른손 엄지손가락을 사용한 경우는 R을 순서대로 이어붙여 문자열 형태로 return 해주세요.
입출력 예
numbers | hand | result |
---|---|---|
[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
이 됩니다.
풀이
1, 4, 7은 왼손, 3, 6, 9는 오른손을 쓰면 되므로 큰 문제는 없지만, 2, 5, 8, 0은 누르려는 숫자와 가장 가까이 위치한 손을 써야한다.
즉, 번호를 누를 때마다 왼손과 오른손의 위치를 기록하고, 2, 5, 8, 0 중 숫자가 나올 경우, 기록했던 각 손의 위치와 해당 숫자의 거리를 비교하여 계산한다.
키패드를 구현하기 위해 2차원 배열을 구성한다.
JAVA
1 2 3 4 5 6 7 8 9
private static final int[][] KEYPAD = new int[][] { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 }, { -2, 0, -1 } }; private int left = -2; private int right = -1;
키패드의 특수문자 *
과 #
은 각각 -2
, -1
로 다룬다.
조건에 초기 각 손의 위치는 왼손 *
, 오른손 #
이므로, 초기 위치 또한 -2
, -1
로 지정한다.
키패드의 위치를 계산할 수 있도록 메서드를 구성한다.
JAVA
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
private int[] getPosition(int number) { int[] pos = new int[] { 0, 0 }; for (int i = 0; i < KEYPAD.length; i++) { for (int j = 0; j < KEYPAD[i].length; j++) { if (KEYPAD[i][j] == number) { pos[0] = i; pos[1] = j; } } } return pos; }
이중 배열을 탐색하여 입력한 키패드의 번호 number
와 동일한 값을 가지는 배열의 인덱스를 반환한다.
예를 들어, 키패드 5의 경우 (1, 1)
의 위치를 가지며, 키패드 7의 경우 (2, 0)
의 위치를 가진다.
키패드 5와 7의 거리는 |1 - 2| + |1 - 0| = 2
가 됨을 알 수 있다.
JAVA
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
private int left = -2; private int right = -1; int[] lPos = getPosition(left); int[] rPos = getPosition(right); int[] toPos = getPosition(number); int lLength = Math.abs(lPos[0] - toPos[0]) + Math.abs(lPos[1] - toPos[1]); int rLength = Math.abs(rPos[0] - toPos[0]) + Math.abs(rPos[1] - toPos[1]); // 왼쪽 엄지가 더 가까울 경우 if (lLength > rLength) { // 왼손 이동 } // 오른쪽 엄지가 더 가까울 경우 else if (lLength < rLength) { // 오른손 이동 } // 둘 다 동일할 경우 else { // 왼손잡이일 경우 if (hand.equals("left")) { // 왼손 이동 } // 오른손잡이일 경우 else { // 오른손 이동 } }
만약 2, 5, 8, 0 중 하나에 해당하는 키패드가 입력되었을 경우, 위와 같이 구현할 수 있다.
lPos
, rPos
는 왼손, 오른손의 위치이며, toPos
는 이동해야할 키패드의 위치다.
이를 통해 각 손과 키패드의 거리인 lLength
, rLength
를 계산하여 이를 비교하면 된다.
코드
JAVA
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125
/** * 키패드 누르기 클래스 * * @author RWB * @since 2021.12.09 Thu 18:58:49 */ class Solution { private static final int[][] KEYPAD = new int[][] { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 }, { -2, 0, -1 } }; private int left = -2; private int right = -1; /** * 해답 반환 메서드 * * @param numbers: [int[]] 순서대로 누를 번호 * @param hand: [String] 주 손잡이 (left, right) * * @return [String] 해답 */ public String solution(int[] numbers, String hand) { StringBuilder builder = new StringBuilder(); for (int number : numbers) { // 왼쪽 번호일 경우 if (number == 1 || number == 4 || number == 7) { left = number; builder.append("L"); } // 오른쪽 번호일 경우 else if (number == 3 || number == 6 || number == 9) { right = number; builder.append("R"); } // 가운데 번호일 경우 else { int[] lPos = getPosition(left); int[] rPos = getPosition(right); int[] toPos = getPosition(number); int lLength = Math.abs(lPos[0] - toPos[0]) + Math.abs(lPos[1] - toPos[1]); int rLength = Math.abs(rPos[0] - toPos[0]) + Math.abs(rPos[1] - toPos[1]); // 왼쪽 엄지가 더 가까울 경우 if (lLength > rLength) { right = number; builder.append("R"); } // 오른쪽 엄지가 더 가까울 경우 else if (lLength < rLength) { left = number; builder.append("L"); } // 둘 다 동일할 경우 else { // 왼손잡이일 경우 if (hand.equals("left")) { left = number; builder.append("L"); } // 오른손잡이일 경우 else { right = number; builder.append("R"); } } } } return builder.toString(); } /** * 위치 반환 메서드 * * @param number: [int] 키 * * @return [int[]] 위치 */ private int[] getPosition(int number) { int[] pos = new int[] { 0, 0 }; for (int i = 0; i < KEYPAD.length; i++) { for (int j = 0; j < KEYPAD[i].length; j++) { if (KEYPAD[i][j] == number) { pos[0] = i; pos[1] = j; } } } return pos; } }
코드는 위와 같다.
🏷️ 태그
읽어주셔서 고마워요!
도움이 되셨다면, 공감이나 댓글을 달아주시는 건 어떤가요?
블로그 운영에 큰 힘이 됩니다.