반응형
눌러야 하는 버튼과 현재 두 손가락의 위치 사이의 거리를 맨해튼 거리를 이용해 풀이했다.
맨해튼 거리 참고글
맨 처음 왼손 엄지손가락은 * 키패드에 오른손 엄지손가락은 # 키패드 위치에서 시작한다. 이때 *는 10, #는 12로 보자. 거리를 구하기 위해 해당 키를 숫자로 간주해야 한다. 또한 키 "0"의 경우는 11로 간주하여 문제를 풀이하는 것이 쉽다. 풀이 코드는 다음과 같다.
function solution(numbers, hand) {
let curr = {left: 10, right: 12};
const answer = numbers.reduce((acc, cur, i) => { // reduce 사용
if(cur === 0) cur = 11; // 키 0을 11로 보자
const remainder = cur % 3;
if(remainder === 0 && cur !== 11) { // 키 3,6,9
acc.push("R");
curr.right = cur;
}
else if(remainder === 1) { // 키 1,4,7
acc.push("L");
curr.left = cur;
}
else { // 키 2,5,8,0
const x = (val) => Math.floor((val - 1) / 3); // x 좌표 구하기 함수
const y = (val) => Math.floor((val - 1) % 3); // y 좌표 구하기 함수
const left = Math.abs(x(cur) - x(curr.left)) + Math.abs(y(cur) - y(curr.left)); // 왼쪽 손가락 위치부터 눌러야하는 키까지의 거리
const right = Math.abs(x(cur) - x(curr.right)) + Math.abs(y(cur) - y(curr.right)); // 오른쪽 손가락 위치부터 눌러야하는 키까지의 거리
if(left > right) { // 왼손가락이 오른손가락보다 가까운 경우
acc.push("R");
curr.right = cur;
} else if (left < right){ // 오른손가락이 왼손가락보다 가까운 경우
acc.push("L");
curr.left = cur;
} else { // 양쪽손가락과 눌러야하는 키까지의 거리가 같은 경우
acc.push(hand === "left"? "L" : "R"); // 왼손잡이인지 오른손잡이인지에 따라 결정
curr[hand] = cur;
}
}
return acc;
},[]).join(""); // 문자열로 변환
return answer;
}
반응형
'자료구조 & 알고리즘' 카테고리의 다른 글
프로그래머스 햄버거 만들기 (stack) - 자바스크립트 풀이 (0) | 2024.11.04 |
---|---|
프로그래머스 체육복 (greedy) - 자바스크립트 풀이 (0) | 2024.10.30 |
맨해튼 거리 Manhattan distance (0) | 2024.10.20 |
프로그래머스 - <[PCCP 기출문제] 1번 / 동영상 재생기> 자바스크립트 문제 풀이 (0) | 2024.10.01 |
[코딩테스트] 프로그래머스 - 롤케이크 자르기 ( 자바스크립트 풀이 ) (1) | 2024.02.03 |