문제
프로그래머스 문제
내 풀이
- 두 지점 간의 거리를 구하기 위해 좌표방식을 사용했다.
function solution(n, h) {
let pad = [[2,4],[1,1],[2,1],[3,1],[1,2],[2,2],[3,2],[1,3],[2,3],[3,3]];
let answer = "";
let left = [1,4];
let right = [3,4];
for(var i=0; i<n.length; i++){
if(n[i] === 1 || n[i] === 4 || n[i] === 7){
answer += "L";
left = pad[n[i]];
} else if(n[i] === 3 || n[i] === 6 || n[i] === 9){
answer += "R";
right = pad[n[i]];
} else {
let dl = Math.abs(left[0] - pad[n[i]][0]) + Math.abs(left[1] - pad[n[i]][1]);
let dr = Math.abs(right[0] - pad[n[i]][0]) + Math.abs(right[1] - pad[n[i]][1]);
if(dl < dr){
answer += "L";
left = pad[n[i]];
} else if(dr < dl){
answer += "R";
right = pad[n[i]];
} else {
answer += h.toUpperCase()[0];
if(h === "left") left = pad[n[i]];
else right = pad[n[i]];
}
}
}
return answer;
}
개선점
- test()를 활용해서 조건문을 길게 안 쓸 수 있다.
function solution(numbers, hand) {
hand = hand[0] === "r" ? "R" : "L"
let position = [1, 4, 4, 4, 3, 3, 3, 2, 2, 2]
let h = { L: [1, 1], R: [1, 1] }
return numbers.map(x => {
if (/[147]/.test(x)) {
h.L = [position[x], 1]
return "L"
}
if (/[369]/.test(x)) {
h.R = [position[x], 1]
return "R"
}
let distL = Math.abs(position[x] - h.L[0]) + h.L[1]
let distR = Math.abs(position[x] - h.R[0]) + h.R[1]
if (distL === distR) {
h[hand] = [position[x], 0]
return hand
}
if (distL < distR) {
h.L = [position[x], 0]
return "L"
}
h.R = [position[x], 0]
return "R"
}).join("")
}