function solution(numbers, hand) {
let result = '';
let left = [4,1],
right = [4,3];
const positions = [
[4,2], [1,1], [1,2], [1,3],
[2,1], [2,2], [2,3],
[3,1], [3,2], [3,3]
];
for(let nums of numbers){
if(nums % 3 === 1){
result = result + 'L';
left = positions[nums];
} else if(nums % 3 === 0 && nums){
result = result + 'R';
right = positions[nums];
} else {
if(Math.abs(left[0]-positions[nums][0]) + Math.abs(left[1]-positions[nums][1]) <
Math.abs(right[0]-positions[nums][0]) + Math.abs(right[1]-positions[nums][1])){
result = result + 'L';
left = positions[nums];
} else if(Math.abs(left[0]-positions[nums][0]) + Math.abs(left[1]-positions[nums][1]) >
Math.abs(right[0]-positions[nums][0]) + Math.abs(right[1]-positions[nums][1])) {
result = result + 'R';
right = positions[nums];
} else {
if(hand === 'left'){
result = result + 'L';
left = positions[nums];
} else {
result = result + 'R';
right = positions[nums];
}
}
}
}
return result;
}
function solution(numbers, hand) {
let left = [4,1],
right = [4,3];
const positions = [
[4,2], [1,1], [1,2], [1,3],
[2,1], [2,2], [2,3],
[3,1], [3,2], [3,3]
];
return numbers.reduce((acc, cur)=>{
if(cur % 3 === 1){
left = positions[cur];
return acc + 'L'
} else if(cur % 3 === 0 && cur){
right = positions[cur];
return acc + 'R'
} else {
if(Math.abs(left[0]-positions[cur][0]) + Math.abs(left[1]-positions[cur][1]) <
Math.abs(right[0]-positions[cur][0]) + Math.abs(right[1]-positions[cur][1])){
left = positions[cur];
return acc + 'L';
} else if(Math.abs(left[0]-positions[cur][0]) + Math.abs(left[1]-positions[cur][1]) >
Math.abs(right[0]-positions[cur][0]) + Math.abs(right[1]-positions[cur][1])) {
right = positions[cur];
return acc + 'R';
} else {
if(hand === 'left'){
left = positions[cur];
return acc + 'L';
} else {
right = positions[cur];
return acc + 'R';
}
}
}
}, '')
}
리듀스로 바꾸면 더 깔끔해질 것 같았는데 생각보다 깔끔해지진 않았다.
그래도 변수 하나 덜 선언하고 코드 조금 더 짧아졌다는데 의의를 두자 😇
출처: 프로그래머스 코딩 테스트 연습, https://programmers.co.kr/learn/challenges#