문제링크
https://programmers.co.kr/learn/courses/30/lessons/67256
스마트폰 전화 키패드의 각 칸에 다음과 같이 숫자들이 적혀 있습니다.
이 전화 키패드에서 왼손과 오른손의 엄지손가락만을 이용해서 숫자만을 입력하려고 합니다.
맨 처음 왼손 엄지손가락은 * 키패드에 오른손 엄지손가락은 # 키패드 위치에서 시작하며, 엄지손가락을 사용하는 규칙은 다음과 같습니다.
- 엄지손가락은 상하좌우 4가지 방향으로만 이동할 수 있으며 키패드 이동 한 칸은 거리로 1에 해당합니다.
- 왼쪽 열의 3개의 숫자 1, 4, 7을 입력할 때는 왼손 엄지손가락을 사용합니다.
- 오른쪽 열의 3개의 숫자 3, 6, 9를 입력할 때는 오른손 엄지손가락을 사용합니다.
- 가운데 열의 4개의 숫자 2, 5, 8, 0을 입력할 때는 두 엄지손가락의 현재 키패드의 위치에서 더 가까운 엄지손가락을 사용합니다.
4-1. 만약 두 엄지손가락의 거리가 같다면, 오른손잡이는 오른손 엄지 손가락, 왼손잡이는 왼손 엄지손가락을 사용합니다.순서대로 누를 번호가 담긴 배열 numbers, 왼손잡이인지 오른손잡이인 지를 나타내는 문자열 hand가 매개변수로 주어질 때, 각 번호를 누른 엄지손가락이 왼손인 지 오른손인 지를 나타내는 연속된 문자열 형태로 return 하도록 solution 함수를 완성해주세요.
- numbers 배열의 크기는 1 이상 1,000 이하입니다.
- numbers 배열 원소의 값은 0 이상 9 이하인 정수입니다.
- hand는 "left" 또는 "right" 입니다.
- "left"는 왼손잡이, "right"는 오른손잡이를 의미합니다.
- 왼손 엄지손가락을 사용한 경우는 L, 오른손 엄지손가락을 사용한 경우는 R을 순서대로 이어붙여 문자열 형태로 return 해주세요.
-- 다른 테케에서 통과하지 못했다ㅠㅠ 다음에 잊혀질 쯤 되면 다시 풀어봐야지ㅠㅠ
function solution(numbers, hand) {
var answer = '';
let l = 10;
let r = 12;
numbers.map(e => e == 0 ? e = 11 : e).forEach((v,i) => {
if(v == 1 || v == 4 || v == 7){
answer += 'L';
l = v;
}else if(v == 3 || v == 6 || v == 9){
answer += 'R';
r = v;
}else{
if(Math.abs(v-l) == Math.abs(v-r) || Math.abs(v-l) == 1 && Math.abs(v-r) == 3 || Math.abs(v-l) == 3 && Math.abs(v-r) == 1 || Math.abs(v-l) == 2 && Math.abs(v-r) == 4 || Math.abs(v-l) == 4 && Math.abs(v-r) == 2){
console.log("=",l,r,v)
if(hand == 'left'){
answer += 'L';
l = v;
}else{
answer += 'R';
r = v;
}
}else {
if(Math.abs(v-l) < Math.abs(v-r)){
if((l == 2 || l == 5 || l == 8) && r-l == 1){
answer += 'R';
r = v;
}else{
answer += 'L';
l = v;
}
}else{
if((l == 2 || l == 5 || l == 8) && r-l == 1){
answer += 'L';
l = v;
}else{
answer += 'R';
r = v;
}
}
}
}
})
return answer;
}
function solution(numbers, hand) {
let answer = '';
const keypad = {
1:[1,1], 2:[1,2], 3:[1,3],
4:[2,1], 5:[2,2], 6:[2,3],
7:[3,1], 8:[3,2], 9:[3,3],
'*':[4,1], 0:[4,2], '#':[4,3]
};
let l = [4,1];
let r = [4,3];
numbers.forEach(v => {
let now = keypad[v];
if(now[1] == 1){
l = now;
answer += 'L';
}else if(now[1] == 3){
r = now;
answer += 'R';
}else{
let distanceL = getDistance(now, l);
let distanceR = getDistance(now, r);
if(distanceL == distanceR){
if(hand == 'left'){
l = now;
answer += 'L';
}else{
r = now;
answer += 'R';
}
}else if(distanceL < distanceR){
l = now;
answer += 'L';
}else{
r = now;
answer += 'R';
}
}
})
return answer;
}
function getDistance(arr1, arr2){
return Math.abs(arr1[0] - arr2[0]) + Math.abs(arr1[1]-arr2[1]);
}
키패드 번호로 절댓값 거리값을 구하면 될 거 같아서 문제를 풀고 앞부분 테스트케이스는 넘어갔지만 통과하지 못했다ㅠㅠ 다른 테스트케이스 경우의 수는 어떻게 나눠야 할 지 모르겠어서 구글링을 하였고 맨하탄의 거리 공식을 알았다. 맨하탄의 거리 공식으로 풀려고 하니 어떻게 풀어나가야 할 지 감이 안 잡혀서 다른 분의 코드를 보게 되었다. 그래서 변수 설정에 대한 중요성을 알았다-!