[Java] 프로그래머스(level-1) - 키패드 누르기

상세한 문제 내용은 여기에서 확인 바랍니다.
입출력 예시
Input-1
numbers = [1, 3, 4, 5, 8, 2, 1, 4, 5, 9, 5]
hand = “right”
Output-1
“LRLLLRLLRRL”
Input-2
numbers = [7, 0, 8, 2, 8, 3, 1, 5, 7, 6, 2]
hand = “left”
Output-2
“LRLLRRLLLRR”
Input-3
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 0]
hand = “right”
Output-3
“LLRLLRLLRL”
문제 풀이
이 문제는 키패드를 누를 때 현재 누른 번호와 누를 번호와의 거리를 구하는 것이 핵심이다.
1
2
3
4
1 2 3
4 5 6
7 8 9
* 0 #
누를 키패드의 *, 0, #을 10, 11, 12로 두어야 거리를 구할 수 있다.
1
2
3
4
1 2 3
4 5 6
7 8 9
10 11 12
먼저 왼손은 *, 오른손은 #에서 시작한다고 하니, 왼손의 초기값은 10, 오른손의 초기값은 12로 초기화하자.
1
2
int L = 10;
int R = 12;
1,4,7은 왼손으로 누르고, 3,6,9 키패드는 오른손으로 누른다.
2,5,8,0 키패드는 더 가까운 손가락으로 누르기 때문에 전에 누른 번호와 누를 번호와 가까운 손가락으로 누를 수 있다.
0 키패드의 경우 앞에서 말한대로 거리를 구해야 하기에 11로 변경해야 한다.
누른 번호와 누를 번호와의 거리
그렇다면 누른 번호와 누를 번호와의 거리는 어떻게 구할까?
- ((현재번호 - 누를번호)/3) + ((현재번호 - 누를번호)%3) 예를 들어 왼손이 4, 오른손이 2이고, 누를번호가 5일 경우를 들어보자.
1
2
3
4
L = 4, R = 2, number = 5
왼손 거리(leftDistance) = ((4-5)/3)+((4-5)%3) = 1
오른손 거리(RightDistance) = ((2-5)/3)+((2-5)%3) = 1
왼손 거리와 오른손 거리가 같을 경우엔 왼손잡이냐 오른손잡이에 따라 손가락을 누른다.
거리 구하는 식을 코드로 작성하면 아래와 같다.
1
2
int leftDistance = Math.abs(((L-num)/3)+((L-num)%3));
int rightDistance = Math.abs(((R-num)/3)+((R-num)%3));
거리 구하는 방법을 알아냈으니, 누를 번호와의 거리가 더 가까운(작은) 손의 손가락으로 누르면 된다.
위 과정을 코드로 작성해보자.
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
for(int num : numbers) {
if(num==0) num = 11;
if(num==1 || num==4 || num==7) { // 1,4,7 키패드는 왼손으로 누른다.
answer += "L";
L=num;
}
else if(num==3 || num==6 || num==9) { // 3,6,9 키패드는 오른손으로 누른다.
answer += "R";
R=num;
}
else { // 2,5,8,0(11) 키패드를 누를 경우
int leftDistance = Math.abs(((L-num)/3)+((L-num)%3));
int rightDistance = Math.abs(((R-num)/3)+((R-num)%3));
if(leftDistance>rightDistance) {
answer += "R";
R=num;
}
else if(rightDistance>leftDistance) {
answer += "L";
L=num;
}
else if(leftDistance==rightDistance && hand.equals("right")) {
answer += "R";
R=num;
}
else if(leftDistance==rightDistance && hand.equals("left")) {
answer += "L";
L=num;
}
}
}
작성 코드
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
class Solution {
public static void main(String[] args) {
int[] numbers = {1,3,4,5,8,2,1,4,5,5,9,5};
// int[] numbers = {1,2,3,4,5,6,7,8,9,0};
// int[] numbers = {7, 0, 8, 2, 8, 3, 1, 5, 7, 6, 2};
// int[] numbers = {1, 2, 3, 3, 4, 4, 5, 5, 8, 8};
String hand = "right";
long start = System.currentTimeMillis();
solution(numbers, hand);
long end = System.currentTimeMillis();
System.out.println("\n수행시간 = " + (end-start));
}
public static String solution(int[] numbers, String hand) {
String answer = "";
int L = 10;
int R = 12;
for(int num : numbers) {
if(num==0) num = 11;
if(num==1 || num==4 || num==7) { // 1,4,7
answer += "L";
L=num;
}
else if(num==3 || num==6 || num==9) { // 3,6,9
answer += "R";
R=num;
}
else { // 2,5,8,0(11)
int leftDistance = Math.abs(((L-num)/3)+((L-num)%3));
int rightDistance = Math.abs(((R-num)/3)+((R-num)%3));
if(leftDistance>rightDistance) {
answer += "R";
R=num;
}
else if(rightDistance>leftDistance) {
answer += "L";
L=num;
}
else if(leftDistance==rightDistance && hand.equals("right")) {
answer += "R";
R=num;
}
else if(leftDistance==rightDistance && hand.equals("left")) {
answer += "L";
L=num;
}
}
}
return answer;
}
}
회고
- 키패드의 번호들이 3으로 나눈 나머지가 각각 다르다는 아이디어를 통해 거리를 구하는 식을 생각해내는게 생각보다 어려웠다.
- 왼손가락과 오른손가락의 초기값을 헷갈려 시간을 더 오래 쏟았다. 문제를 성급하게 읽어 넘어가지 않도록 해야겠다.