- [프로그래머스 / JAVA] Level 2 메뉴 리뉴얼 (72411)
- [프로그래머스 / JAVA] Level 2 행렬 테두리 회전하기 (77485)
- [프로그래머스 / JAVA] Level 2 짝지어 제거하기 (12973)
- [프로그래머스 / MySQL] Level 2 루시와 엘라 찾기 (59046)
- [프로그래머스 / MySQL] Level 2 고양이와 개는 몇 마리 있을까 (59040)
- [프로그래머스 / JAVA] Level 2 타겟 넘버 (43165)
- [프로그래머스 / JAVA] Level 2 더 맵게 (42626)
- [프로그래머스 / JAVA] Level 2 기능개발 (42586)
- [프로그래머스 / JAVA] Level 2 124 나라의 숫자 (12899)
- [프로그래머스 / JAVA] Level 2 멀쩡한 사각형 (62048)
- [프로그래머스 / JAVA] Level 2 단체사진 찍기 (1835)
- [프로그래머스 / JAVA] Level 2 카카오프렌즈 컬러링북 (1829)
- [프로그래머스 / JAVA] Level 2 오픈채팅방 (42888)
- [프로그래머스 / JAVA] Level 2 문자열 압축 (60057)
- [프로그래머스 / JAVA] Level 1 직사각형 별찍기 (12954)
- [프로그래머스 / JAVA] Level 1 x만큼 간격이 있는 n개의 숫자 (12954)
- [프로그래머스 / JAVA] Level 1 행렬의 덧셈 (12950)
- [프로그래머스 / JAVA] Level 1 핸드폰 번호 가리기 (12948)
- [프로그래머스 / JAVA] Level 1 하샤드 수 (12947)
- [프로그래머스 / JAVA] Level 1 평균 구하기 (12944)
- [프로그래머스 / JAVA] Level 1 콜라츠 추측 (12943)
- [프로그래머스 / JAVA] Level 1 최대공약수와 최소공배수 (12940)
- [프로그래머스 / JAVA] Level 1 짝수와 홀수 (12937)
- [프로그래머스 / JAVA] Level 1 제일 작은 수 제거하기 (12935)
- [프로그래머스 / JAVA] Level 1 정수 제곱근 판별 (12934)
- [프로그래머스 / JAVA] Level 1 정수 내림차순으로 배치하기 (12933)
- [프로그래머스 / JAVA] Level 1 자연수 뒤집어 배열로 만들기 (12932)
- [프로그래머스 / JAVA] Level 1 자릿수 더하기 (12931)
- [프로그래머스 / JAVA] Level 1 이상한 문자 만들기 (12930)
- [프로그래머스 / JAVA] Level 1 약수의 합 (12928)
- [프로그래머스 / JAVA] Level 1 시저 암호 (12926)
- [프로그래머스 / JAVA] Level 1 문자열을 정수로 바꾸기 (12925)
- [프로그래머스 / JAVA] Level 1 수박수박수박수박수박수? (12922)
- [프로그래머스 / JAVA] Level 1 소수 찾기 (12921)
- [프로그래머스 / JAVA] Level 1 서울에서 김서방 찾기 (12919)
- [프로그래머스 / JAVA] Level 1 문자열 다루기 기본 (12918)
- [프로그래머스 / JAVA] Level 1 문자열 내림차순으로 배치하기 (12917)
- [프로그래머스 / JAVA] Level 1 문자열 내 p와 y의 개수 (12916)
- [프로그래머스 / JAVA] Level 1 문자열 내 마음대로 정렬하기 (12915)
- [프로그래머스 / JAVA] Level 1 두 정수 사이의 합 (12912)
- [프로그래머스 / JAVA] Level 1 나누어 떨어지는 숫자 배열 (12910)
- [프로그래머스 / JAVA] Level 1 같은 숫자는 싫어 (12906)
- [프로그래머스 / MySQL] Level 1 상위 n개 레코드 (59405)
- [프로그래머스 / JAVA] Level 1 다트 게임 (17682)
- [프로그래머스 / MySQL] Level 1 여러 기준으로 정렬하기 (59404)
- [프로그래머스 / JAVA] Level 1 가운데 글자 가져오기 (12903)
- [프로그래머스 / JAVA] Level 1 비밀지도 (17681)
- [프로그래머스 / JAVA] Level 1 부족한 금액 계산하기 (82612)
- [프로그래머스 / MySQL] Level 1 동물의 아이디와 이름 (59403)
- [프로그래머스 / JAVA] Level 1 나머지가 1이 되는 수 찾기 (87389)
- [프로그래머스 / JAVA] Level 1 최소직사각형 (86491)
- [프로그래머스 / MySQL] Level 1 어린 동물 찾기 (59037)
- [프로그래머스 / JAVA] Level 1 2016년 (12901)
- [프로그래머스 / MySQL] Level 1 아픈 동물 찾기 (59036)
- [프로그래머스 / JAVA] Level 1 두 개 뽑아서 더하기 (68644)
- [프로그래머스 / MySQL] Level 1 이름이 있는 동물의 아이디 (59407)
- [프로그래머스 / JAVA] Level 1 두 개 뽑아서 더하기 (12982)
- [프로그래머스 / JAVA] Level 1 예산 (12982)
- [프로그래머스 / JAVA] Level 1 3진법 뒤집기 (68935)
- [프로그래머스 / JAVA] Level 1 약수의 개수와 덧셈 (77884)
- [프로그래머스 / JAVA] Level 1 실패율 (42889)
- [프로그래머스 / JAVA] Level 1 폰켓몬 (1845)
- [프로그래머스 / MySQL] Level 1 이름이 없는 동물의 아이디 (59039)
- [프로그래머스 / MySQL] Level 1 최댓값 구하기 (59415)
- [프로그래머스 / MySQL] Level 1 모든 레코드 조회하기 (59034)
- [프로그래머스 / JAVA] Level 1 체육복 (42862)
- [프로그래머스 / JAVA] Level 1 모의고사 (42840)
- [프로그래머스 / JAVA] Level 1 완주하지 못한 선수 (42576)
- [프로그래머스 / JAVA] Level 1 소수 만들기 (12977)
- [프로그래머스 / JAVA] Level 1 음양 더하기 (76501)
- [프로그래머스 / JAVA] Level 1 K번째수 (42748)
- [프로그래머스 / JAVA] Level 1 내적 (70128)
- [프로그래머스 / JAVA] Level 1 없는 숫자 더하기 (86051)
- [프로그래머스 / JAVA] Level 1 크레인 인형뽑기 게임 (64061)
👀 [프로그래머스 / JAVA] Level 1 키패드 누르기 (67256)
- [프로그래머스 / JAVA] Level 1 숫자 문자열과 영단어 (81301)
- [프로그래머스 / JAVA] Level 1 신규 아이디 추천 (72410)
- [프로그래머스 / JAVA] Level 1 로또의 최고 순위와 최저 순위 (77484)
키패드 누르기 🔗
🔗 키패드 누르기
문제 설명 🔗
스마트폰 전화 키패드의 각 칸에 다음과 같이 숫자들이 적혀 있습니다.
이 전화 키패드에서 왼손과 오른손의 엄지손가락만을 이용해서 숫자만을 입력하려고 합니다.
맨 처음 왼손 엄지손가락은 *
키패드에 오른손 엄지손가락은 #
키패드 위치에서 시작하며, 엄지손가락을 사용하는 규칙은 다음과 같습니다.
- 엄지손가락은 상하좌우 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
0 | private static final int[][] KEYPAD = new int[][] { |
1 | { 1, 2, 3 }, |
2 | { 4, 5, 6 }, |
3 | { 7, 8, 9 }, |
4 | { -2, 0, -1 } |
5 | }; |
6 | |
7 | private int left = -2; |
8 | private int right = -1; |
키패드의 특수문자 *
과 #
은 각각 -2
, -1
로 다룬다.
조건에 초기 각 손의 위치는 왼손 *
, 오른손 #
이므로, 초기 위치 또한 -2
, -1
로 지정한다.
키패드의 위치를 계산할 수 있도록 메서드를 구성한다.
JAVA
0 | private int[] getPosition(int number) |
1 | { |
2 | int[] pos = new int[] { 0, 0 }; |
3 | |
4 | for (int i = 0; i < KEYPAD.length; i++) |
5 | { |
6 | for (int j = 0; j < KEYPAD[i].length; j++) |
7 | { |
8 | if (KEYPAD[i][j] == number) |
9 | { |
10 | pos[0] = i; |
11 | pos[1] = j; |
12 | } |
13 | } |
14 | } |
15 | |
16 | return pos; |
17 | } |
이중 배열을 탐색하여 입력한 키패드의 번호 number
와 동일한 값을 가지는 배열의 인덱스를 반환한다.
예를 들어, 키패드 5의 경우 (1, 1)
의 위치를 가지며, 키패드 7의 경우 (2, 0)
의 위치를 가진다.
키패드 5와 7의 거리는 |1 - 2| + |1 - 0| = 2
가 됨을 알 수 있다.
JAVA
0 | private int left = -2; |
1 | private int right = -1; |
2 | |
3 | int[] lPos = getPosition(left); |
4 | int[] rPos = getPosition(right); |
5 | int[] toPos = getPosition(number); |
6 | |
7 | int lLength = Math.abs(lPos[0] - toPos[0]) + Math.abs(lPos[1] - toPos[1]); |
8 | int rLength = Math.abs(rPos[0] - toPos[0]) + Math.abs(rPos[1] - toPos[1]); |
9 | |
10 | // 왼쪽 엄지가 더 가까울 경우 |
11 | if (lLength > rLength) |
12 | { |
13 | // 왼손 이동 |
14 | } |
15 | |
16 | // 오른쪽 엄지가 더 가까울 경우 |
17 | else if (lLength < rLength) |
18 | { |
19 | // 오른손 이동 |
20 | } |
21 | |
22 | // 둘 다 동일할 경우 |
23 | else |
24 | { |
25 | // 왼손잡이일 경우 |
26 | if (hand.equals("left")) |
27 | { |
28 | // 왼손 이동 |
29 | } |
30 | |
31 | // 오른손잡이일 경우 |
32 | else |
33 | { |
34 | // 오른손 이동 |
35 | } |
36 | } |
만약 2, 5, 8, 0 중 하나에 해당하는 키패드가 입력되었을 경우, 위와 같이 구현할 수 있다.
lPos
, rPos
는 왼손, 오른손의 위치이며, toPos
는 이동해야할 키패드의 위치다.
이를 통해 각 손과 키패드의 거리인 lLength
, rLength
를 계산하여 이를 비교하면 된다.
코드 🔗
JAVA
0 | /** |
1 | * 키패드 누르기 클래스 |
2 | * |
3 | * @author RWB |
4 | * @since 2021.12.09 Thu 18:58:49 |
5 | */ |
6 | class Solution |
7 | { |
8 | private static final int[][] KEYPAD = new int[][] { |
9 | { 1, 2, 3 }, |
10 | { 4, 5, 6 }, |
11 | { 7, 8, 9 }, |
12 | { -2, 0, -1 } |
13 | }; |
14 | |
15 | private int left = -2; |
16 | private int right = -1; |
17 | |
18 | /** |
19 | * 해답 반환 메서드 |
20 | * |
21 | * @param numbers: [int[]] 순서대로 누를 번호 |
22 | * @param hand: [String] 주 손잡이 (left, right) |
23 | * |
24 | * @return [String] 해답 |
25 | */ |
26 | public String solution(int[] numbers, String hand) |
27 | { |
28 | StringBuilder builder = new StringBuilder(); |
29 | |
30 | for (int number : numbers) |
31 | { |
32 | // 왼쪽 번호일 경우 |
33 | if (number == 1 || number == 4 || number == 7) |
34 | { |
35 | left = number; |
36 | |
37 | builder.append("L"); |
38 | } |
39 | |
40 | // 오른쪽 번호일 경우 |
41 | else if (number == 3 || number == 6 || number == 9) |
42 | { |
43 | right = number; |
44 | |
45 | builder.append("R"); |
46 | } |
47 | |
48 | // 가운데 번호일 경우 |
49 | else |
50 | { |
51 | int[] lPos = getPosition(left); |
52 | int[] rPos = getPosition(right); |
53 | int[] toPos = getPosition(number); |
54 | |
55 | int lLength = Math.abs(lPos[0] - toPos[0]) + Math.abs(lPos[1] - toPos[1]); |
56 | int rLength = Math.abs(rPos[0] - toPos[0]) + Math.abs(rPos[1] - toPos[1]); |
57 | |
58 | // 왼쪽 엄지가 더 가까울 경우 |
59 | if (lLength > rLength) |
60 | { |
61 | right = number; |
62 | |
63 | builder.append("R"); |
64 | } |
65 | |
66 | // 오른쪽 엄지가 더 가까울 경우 |
67 | else if (lLength < rLength) |
68 | { |
69 | left = number; |
70 | |
71 | builder.append("L"); |
72 | } |
73 | |
74 | // 둘 다 동일할 경우 |
75 | else |
76 | { |
77 | // 왼손잡이일 경우 |
78 | if (hand.equals("left")) |
79 | { |
80 | left = number; |
81 | |
82 | builder.append("L"); |
83 | } |
84 | |
85 | // 오른손잡이일 경우 |
86 | else |
87 | { |
88 | right = number; |
89 | |
90 | builder.append("R"); |
91 | } |
92 | } |
93 | } |
94 | } |
95 | |
96 | return builder.toString(); |
97 | } |
98 | |
99 | /** |
100 | * 위치 반환 메서드 |
101 | * |
102 | * @param number: [int] 키 |
103 | * |
104 | * @return [int[]] 위치 |
105 | */ |
106 | private int[] getPosition(int number) |
107 | { |
108 | int[] pos = new int[] { 0, 0 }; |
109 | |
110 | for (int i = 0; i < KEYPAD.length; i++) |
111 | { |
112 | for (int j = 0; j < KEYPAD[i].length; j++) |
113 | { |
114 | if (KEYPAD[i][j] == number) |
115 | { |
116 | pos[0] = i; |
117 | pos[1] = j; |
118 | } |
119 | } |
120 | } |
121 | |
122 | return pos; |
123 | } |
124 | } |
코드는 위와 같다.
📆 작성일
2021-12-14 Tue 03:46:59
📚 카테고리
🏷️ 태그