문제 설명
스마트폰 전화 키패드의 각 칸에 다음과 같이 숫자들이 적혀 있습니다.
1
2
3
4
1 2 3
4 5 6
7 8 9
* 0 #
이 전화 키패드에서 왼손과 오른손의 엄지손가락만을 이용해서 숫자만을 입력하려고 합니다.맨 처음 왼손 엄지손가락은 *
키패드에 오른손 엄지손가락은 #
키패드 위치에서 시작하며, 엄지손가락을 사용하는 규칙은 다음과 같습니다.
- 엄지손가락은 상하좌우 4가지 방향으로만 이동할 수 있으며 키패드 이동 한 칸은 거리로 1에 해당합니다.
- 왼쪽 열의 3개의 숫자
1
,4
,7
을 입력할 때는 왼손 엄지손가락을 사용합니다. - 오른쪽 열의 3개의 숫자
3
,6
,9
를 입력할 때는 오른손 엄지손가락을 사용합니다. - 가운데 열의 4개의 숫자
2
,5
,8
,0
을 입력할 때는 두 엄지손가락의 현재 키패드의 위치에서 더 가까운 엄지손가락을 사용합니다.4-1. 만약 두 엄지손가락의 거리가 같다면, 오른손잡이는 오른손 엄지손가락, 왼손잡이는 왼손 엄지손가락을 사용합니다.
순서대로 누를 번호가 담긴 배열 numbers, 왼손잡이인지 오른손잡이인 지를 나타내는 문자열 hand가 매개변수로 주어질 때, 각 번호를 누른 엄지손가락이 왼손인 지 오른손인 지를 나타내는 연속된 문자열 형태로 return 하도록 solution 함수를 완성해주세요.
제한사항
- numbers 배열의 크기는 1 이상 1,000 이하입니다.
- numbers 배열 원소의 값은 0 이상 9 이하인 정수입니다.
- hand는
"left"
또는"right"
입니다."left"
는 왼손잡이,"right"
는 오른손잡이를 의미합니다.
- 왼손 엄지손가락을 사용한 경우는
L
, 오른손 엄지손가락을 사용한 경우는R
을 순서대로 이어붙여 문자열 형태로 return 해주세요.
🙋♂️나의 풀이
- 처음엔 1차원 배열에 숫자를 모두 넣어서 인덱스 간의 차이로 거리를 구하려고 했다.
- 하지만, 도저히 어떻게 풀어야 하는 지 감이 오지 않아서 풀이를 참고해서 풀었다.
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
function solution(numbers, hand) {
let answer = [];
let leftHand = "*";
let rightHand = "#";
const KEYPAD = {
1: [0, 0],
2: [0, 1],
3: [0, 2],
4: [1, 0],
5: [1, 1],
6: [1, 2],
7: [2, 0],
8: [2, 1],
9: [2, 2],
"*": [3, 0],
0: [3, 1],
"#": [3, 2],
};
const LEFT_PAD = [1, 4, 7];
const RIGHT_PAD = [3, 6, 9];
const getDistance = (cur, tar) => {
const currentPosition = KEYPAD[cur];
const targetPosition = KEYPAD[tar];
return (
Math.abs(currentPosition[0] - targetPosition[0]) +
Math.abs(currentPosition[1] - targetPosition[1])
);
};
numbers.forEach((number) => {
if (LEFT_PAD.includes(number)) {
answer.push("L");
leftHand = number;
return;
}
if (RIGHT_PAD.includes(number)) {
answer.push("R");
rightHand = number;
return;
}
const distanceToLeft = getDistance(leftHand, number);
const distanceToRight = getDistance(rightHand, number);
if (distanceToLeft === distanceToRight) {
if (hand === "right") {
answer.push("R");
rightHand = number;
return;
}
if (hand === "left") {
answer.push("L");
leftHand = number;
return;
}
}
if (distanceToLeft > distanceToRight) {
answer.push("R");
rightHand = number;
return;
}
if (distanceToLeft < distanceToRight) {
answer.push("L");
leftHand = number;
return;
}
});
return answer.join("");
}
👀 느낀 점
- 알고리즘이나 자료구조를 활용해서 깔끔하게 풀어내는 문제는 아니지만, 단순 구현 문제여도 논리적으로 접근해야 할 필요성을 느꼈다.
- 특히,
Early Return
을 활용해서else
문을 최소화 하기 위해 조건문의 순서와 범위를 생각하고,return
을 적절하게 사용하는 것의 필요성을 느꼈다. 이를 통해 훨씬 의미가 명확하고 가독성이 좋은 작성할 수 있다는 장점이 있다.