[카카오 인턴] 키패드 누르기

[카카오 인턴] 키패드 누르기
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
// https://programmers.co.kr/learn/courses/30/lessons/67256
function solution(numbers, hand) {
// 1,4,7 ; left
// 2,5,8,0 ; 가까운거, 같을시 왼손잡이냐 오른손잡이냐
// 3,6,9 ; right
switch (hand) {
case 'left':
hand = 'L';
break;
default:
hand = 'R';
break;
}
let curleft = '*';
let curright = '#';
let answer = '';
const maptable = {
1: { low: 0, col: 0 },
2: { low: 0, col: 1 },
3: { low: 0, col: 2 },
4: { low: 1, col: 0 },
5: { low: 1, col: 1 },
6: { low: 1, col: 2 },
7: { low: 2, col: 0 },
8: { low: 2, col: 1 },
9: { low: 2, col: 2 },
'*': { low: 3, col: 0 },
0: { low: 3, col: 1 },
'#': { low: 3, col: 2 },
};
let keypad = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9],
[-1, 0, -2],
];
function getCost(num, cur) {
let cost = 0;
const src = maptable[cur];
const des = maptable[num];
let low = Math.abs(des['low'] - src['low']);
let col = Math.abs(des['col'] - src['col']);
cost = low + col;
return cost;
}
let x;
numbers.forEach((number, idx) => {
if (number.toString().match(/[369]/)) {
x = 'R';
curright = number;
} else if (number.toString().match(/[147]/)) {
x = 'L';
curleft = number;
} else {
// 가까운손
const costleft = getCost(number, curleft);
const costright = getCost(number, curright);
if (costleft == costright) {
x = hand;
switch (hand) {
case 'L':
curleft = number;
break;
default:
curright = number;
break;
}
} else if (costleft > costright) {
x = 'R';
curright = number;
} else {
x = 'L';
curleft = number;
}
}
answer += x;
});
return answer;
}
result = solution([1, 3, 4, 5, 8, 2, 1, 4, 5, 9, 5], 'right');
result = solution([7, 0, 8, 2, 8, 3, 1, 5, 7, 6, 2], 'left');
result = solution([1, 2, 3, 4, 5, 6, 7, 8, 9, 0], 'right');

해설

  • 입력으로 키패드를 누르는 순서와 왼손잡이인지 오른손잡이인지 알려주는 문자열을 받는다
  • 그러면 “LRLLLRLLRRL” 식으로 각 숫자를 어떤 손으로 눌렀는지 문자열로 반환한다
  • 147, 369는 좌우 키패드이기때문에 어떤 손으로 눌러야하는 정해져 있고,
  • 문제는 가운데 있는 키들이다. 2580
  • 2580중 하나의 키를 눌러야하는 상황이면 가까운 손으로 눌러야한다
  • 거리가 같은 경우에는 왼손잡이는 왼손으로, 오른손잡이는 오른손으로 누른다
  • 나는 정규식으로 147, 369를 처리하고
  • 가운데 키를 누르는 경우에는 왼손 오른손 누가더 가까운데 getCost 함수로 비교한다
  • getCost함수는 그냥 몇칸 떨어져 있는지 비교하는 단순한 함수이다
  • maptable이라는걸 만들어서 키패드를 2차원 배열로 표시해을 때 인덱스를 저장했다
Author

chinsung

Posted on

2020-09-18

Updated on

2022-01-08

Licensed under

댓글