문제
접근
3으로 나눈 몫과 나머지의 조합으로 생각하면 쉽다.
이를 위해서 *, 0, #은 각각 10, 11 12로 생각하고 푼다.
우선 키패드가 어떤 줄에 있는지는 3으로 나눈 나머지를 이용한다.
나머지가 1이면 왼쪽, 0이면 오른쪽, 2이면 가운데이다.
가운데 줄인 경우 거리를 계산해야 한다. 거리의 경우, 두 숫자의 차이의 몫과 나머지를 더하면 된다. 다음과 같이 구할 수 있다.
손가락이 있는 번호 \(=hand\)
눌러야할 번호 \(=key\) 거리 \(=d\)
코드
- 파이썬 코드
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
def solution(numbers, hand):
answer = ''
left = 10
right = 12
for number in numbers:
if number == 0:
number = 11
if number % 3 == 1:
answer += 'L'
left = number
elif number % 3 == 0:
answer += 'R'
right = number
else:
l_dis = abs(number - left)
l_dis = l_dis//3 + l_dis%3
r_dis = abs(number - right)
r_dis = r_dis//3 + r_dis%3
if l_dis > r_dis:
answer += 'R'
right = number
elif l_dis < r_dis:
answer += 'L'
left = number
else:
if hand == 'right':
answer += 'R'
right = number
else:
answer += 'L'
left = number
return answer
- C++ 코드
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
#include <string>
#include <vector>
#include <cstdlib>
using namespace std;
string solution(vector<int> numbers, string hand) {
string answer = "";
int left = 10;
int right = 12;
for(int i = 0; i<numbers.size(); i++){
if(numbers[i] == 0)
numbers[i] = 11;
if(numbers[i] % 3 == 1){
answer += "L";
left = numbers[i];
}
else if(numbers[i] % 3 == 0){
answer += "R";
right = numbers[i];
}
else{
int l_dis = abs(numbers[i] - left);
l_dis = l_dis/3 + l_dis%3;
int r_dis = abs(numbers[i] - right);
r_dis = r_dis/3 + r_dis%3;
if(l_dis < r_dis){
answer += "L";
left = numbers[i];
}
else if(l_dis > r_dis){
answer += "R";
right = numbers[i];
}
else{
if(hand == "right"){
answer += "R";
right = numbers[i];
}
else{
answer += "L";
left = numbers[i];
}
}
}
}
return answer;
}