스마트폰 전화 키패드의 각 칸에 다음과 같이 숫자들이 적혀 있습니다.
이 전화 키패드에서 왼손과 오른손의 엄지손가락만을 이용해서 숫자만을 입력하려고 합니다.
맨 처음 왼손 엄지손가락은 * 키패드에 오른손 엄지손가락은 # 키패드 위치에서 시작하며, 엄지손가락을 사용하는 규칙은 다음과 같습니다.
순서대로 누를 번호가 담긴 배열 numbers, 왼손잡이인지 오른손잡이인 지를 나타내는 문자열 hand가 매개변수로 주어질 때, 각 번호를 누른 엄지손가락이 왼손인 지 오른손인 지를 나타내는 연속된 문자열 형태로 return 하도록 solution 함수를 완성해주세요.
function solution(numbers, hand) {
let answer = '';
const keyPad = [[1, 2, 3], [4, 5, 6], [7, 8 ,9], ['*', 0, '#']];
let left = [3, 0];
let right = [3, 2];
function findPosition(number){
for(let j = 0; j < keyPad.length; j++){
for(let k = 0; k < keyPad[j].length; k++){
if(keyPad[j][k] === number){
return [j, k];
}
}
}
}
for(let i = 0; i < numbers.length; i++){
const position = findPosition(numbers[i]);
const leftDistance = Math.abs(left[0] - position[0]) + Math.abs(left[1] - position[1]);
const rightDistance = Math.abs(right[0] - position[0]) + Math.abs(right[1] - position[1]);
if(position[1] === 0){
answer += "L";
left = position;
}
else if(position[1] === 2){
answer += "R";
right = position;
}
else{
if(leftDistance < rightDistance){
answer += "L";
left = position;
}
else if(leftDistance > rightDistance){
answer += "R";
right = position;
}
else if(hand === "left"){
answer += "L";
left = position;
}
else{
answer += "R";
right = position;
}
}
}
return answer;
}
function solution(numbers, hand) {
var answer = "";
let list = {
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],
};
let left = list["*"];
let right = list["#"];
for (let x of numbers) {
let [i, j] = list[x];
if (j === 0) {
answer += "L";
left = list[x];
}
else if (j === 2) {
answer += "R";
right = list[x];
}
else {
let tmpL = Math.abs(i - left[0]) + Math.abs(j - left[1]);
let tmpR = Math.abs(i - right[0]) + Math.abs(j - right[1]);
if (tmpL > tmpR) {
right = list[x];
answer += "R";
} else if (tmpL < tmpR) {
left = list[x];
answer += "L";
} else if (tmpL === tmpR) {
if (hand === "left") {
left = list[x];
answer += "L";
} else {
right = list[x];
answer += "R";
}
}
}
}
return answer;
}
다른 분이 작성한 코드를 보면 전반적으로 비슷하지만, 키패드의 위치값을 미리 입력해 줬다는 점에서 차이가 있다. 코드를 실행하는 시간 면에서는 훨씬 좋을 것 같다🙂
물론, 코드를 유지보수하는 측면에서는 키패드를 수정할 때마다 위치값을 일일이 세어서 넣어줘야 한다는 점에서 불편할 수 있기 때문에 선택의 문제인 것 같다🤔