문제
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
정답
function solution(numbers, hand) {
// 각각의 키패드 좌표를 담은 배열을 생성한다
const keypadPosition = [
[0, 3],
[1, 3],
[2, 3],
[0, 2],
[1, 2],
[2, 2],
[0, 1],
[1, 1],
[2, 1],
[1, 0],
];
const leftNumbers = [1, 4, 7];
const rightNumbers = [3, 6, 9];
// 왼손, 오른손의 초깃값 위치 변수를 좌표로 설정한다
let leftHand = [0, 0];
let rightHand = [2, 0];
let answer = "";
for (let i = 0; i < numbers.length; i++) {
// 키패드가 0일 때는 인덱스 9에 해당하는 좌표(10번째 요소)를 사용한다
// 그렇지 않은 경우:
// keypadPosition과 일치하는 좌표가 targetPosition
// 각각의 손 위치에서 목표 위치까지의 거리:
// 두 좌표의 x, y 값을 뺀 절댓값의 합
const targetPosition = numbers[i] === 0 ? keypadPosition[9] : keypadPosition[numbers[i] - 1];
numbersToPosition[i];
const leftHandToTarget =
Math.abs(leftHand[0] - targetPosition[0]) + Math.abs(leftHand[1] - targetPosition[1]);
const rightHandToTarget =
Math.abs(rightHand[0] - targetPosition[0]) + Math.abs(rightHand[1] - targetPosition[1]);
// 1, 4, 7은 무조건 왼손, 3, 6, 9는 오른손을 사용한다
// 그렇지 않은 경우:
// 각각의 손 위치에서 목표 위치까지의 거리를 비교해 가까운 손을 사용한다
// 거리가 같은 경우:
// 왼손잡이인지 오른손잡이인지를 확인해 해당 손을 사용한다
if (leftNumbers.includes(numbers[i])) {
answer += "L";
leftHand = targetPosition;
} else if (rightNumbers.includes(numbers[i])) {
answer += "R";
rightHand = targetPosition;
} else if (leftHandToTarget === rightHandToTarget) {
if (hand === "left") {
answer += "L";
leftHand = targetPosition;
} else {
answer += "R";
rightHand = targetPosition;
}
} else if (leftHandToTarget < rightHandToTarget) {
answer += "L";
leftHand = targetPosition;
} else {
answer += "R";
rightHand = targetPosition;
}
}
return answer;
}