문제를 간소화하면 1, 4, 7
, 3, 6, 9
를 받으면 왼손("L"
)과 오른손("R"
)의 고정된 문자열을 리턴하고
2, 5, 8, 0
를 받는다면 왼손과 오른손의 위치에 따른 거리를 기반으로 가까운 손으로 번호를 누르게 됩니다.
만일 왼손과 오른손의 거리가 같다면, 사용자가 왼손잡이인지 오른손잡이인지에 따라 왼손과 오른손을 결정하게 됩니다.
저는 각 번호의 거리를 계산할 수 있는 함수인 getDistanceXY
를 생성하여 풀어보았습니다.
let getDistanceXY = (xy1, xy2) => Math.abs(xy1[0] - xy2[0]) + Math.abs(xy1[1] - xy2[1]);
let solution = (numbers, hand) => {
let curLeft = "*";
let curRight = "#";
let NumberXYObj = {
1: [0, 0],
2: [1, 0],
3: [2, 0],
4: [0, 1],
5: [1, 1],
6: [2, 1],
7: [0, 2],
8: [1, 2],
9: [2, 2],
"*": [0, 3],
0: [1, 3],
"#": [2, 3]
};
return numbers.map((number) => {
if(number === 1 || number === 4 || number === 7){
curLeft = number;
return "L";
}else if(number === 3 || number === 6 || number === 9){
curRight = number;
return "R";
}else {
let distanceFromLeft = getDistanceXY(NumberXYObj[curLeft], NumberXYObj[number]);
let distanceFromRight = getDistanceXY(NumberXYObj[curRight], NumberXYObj[number]);
if(distanceFromLeft === distanceFromRight) {
if(hand === "right") {
curRight = number;
return "R";
}
curLeft = number;
return "L";
}else if(distanceFromLeft < distanceFromRight) {
curLeft = number;
return "L";
}
curRight = number;
return "R";
}
}).join("");
}
코드를 설명하면 위 문제에서 나온 조건을 정말 그대로 코드로 구현한 것이며, 특이한 점은 거리를 구하는 함수 정도인 것 같습니다.