스마트폰 전화 키패드의 각 칸에 다음과 같이 숫자들이 적혀 있습니다.
이 전화 키패드에서 왼손과 오른손의 엄지손가락만을 이용해서 숫자만을 입력하려고 합니다.맨 처음 왼손 엄지손가락은 *
키패드에 오른손 엄지손가락은 #
키패드 위치에서 시작하며, 엄지손가락을 사용하는 규칙은 다음과 같습니다.
1
, 4
, 7
을 입력할 때는 왼손 엄지손가락을 사용합니다.3
, 6
, 9
를 입력할 때는 오른손 엄지손가락을 사용합니다.2
, 5
, 8
, 0
을 입력할 때는 두 엄지손가락의 현재 키패드의 위치에서 더 가까운 엄지손가락을 사용합니다.4-1. 만약 두 엄지손가락의 거리가 같다면, 오른손잡이는 오른손 엄지손가락, 왼손잡이는 왼손 엄지손가락을 사용합니다.순서대로 누를 번호가 담긴 배열 numbers, 왼손잡이인지 오른손잡이인 지를 나타내는 문자열 hand가 매개변수로 주어질 때, 각 번호를 누른 엄지손가락이 왼손인 지 오른손인 지를 나타내는 연속된 문자열 형태로 return 하도록 solution 함수를 완성해주세요.
"left"
또는 "right"
입니다."left"
는 왼손잡이, "right"
는 오른손잡이를 의미합니다.L
, 오른손 엄지손가락을 사용한 경우는 R
을 순서대로 이어붙여 문자열 형태로 return 해주세요.입출력 예 #1
순서대로 눌러야 할 번호가 [1, 3, 4, 5, 8, 2, 1, 4, 5, 9, 5]이고, 오른손잡이입니다.
따라서 "LRLLLRLLRRL"
를 return 합니다.
입출력 예 #2
왼손잡이가 [7, 0, 8, 2, 8, 3, 1, 5, 7, 6, 2]를 순서대로 누르면 사용한 손은 "LRLLRRLLLRR"
이 됩니다.
입출력 예 #3
오른손잡이가 [1, 2, 3, 4, 5, 6, 7, 8, 9, 0]를 순서대로 누르면 사용한 손은 "LLRLLRLLRL"
이 됩니다.
let l = [1, 4, 7, 10] // 왼손
let m = [2, 5, 8, 11] // 중앙
let r = [3, 6, 9, 12] // 오른손
왼손은 [1, 4, 7]을 고정적으로 누르고, 오른손은 [3, 6, 9]를 고정적으로 누르게 만든다. 중앙에 있는 [2, 5, 8, 0]은 왼손이든 오른손이든 마지막에 누른 숫자에서 가까운 손으로 눌러준다. 중앙숫자 0을 눌러야 할때 거리를 더 쉽게 만들기 위해서 왼손의 *는 10, 중앙의 0은 11, 오른손의 #은 12로 바꿔준다. 추가로 키패드를 누를때마다 누른 숫자와 배열의 인덱스값을 저장해 둠으로써 이동 거리를 구할 수 있게 만들어준다.
function solution(numbers, hand) {
var answer = '';
let l = [1, 4, 7, 10];
let r = [3, 6, 9, 12];
let m = [2, 5, 8, 11];
let ltemp = 10;
let rtemp = 12;
let lidx = 3;
let ridx = 3;
for (let i = 0; i < numbers.length; i++) {
let num = numbers[i];
if (num === 0) num = 11
if (l.indexOf(num) !== -1) {
answer += 'L'
lidx = l.indexOf(num);
ltemp = num;
} else if (r.indexOf(num) !== -1) {
answer += 'R'
ridx = r.indexOf(num);
rtemp = num;
} else if (m.includes(num)) {
let midx = m.indexOf(num);
let ld = lidx > midx ? lidx - midx : midx - lidx;
let rd = ridx > midx ? ridx - midx : midx - ridx;
if (!m.includes(ltemp)) ld++;
if (!m.includes(rtemp)) rd++;
if (ld > rd) {
answer += 'R';
rtemp = num;
ridx = midx;
} else if (ld < rd) {
answer += 'L';
ltemp = num;
lidx = midx;
} else if (ld === rd) {
if (hand === 'left') {
answer += 'L';
ltemp = num;
lidx = midx;
} else if (hand === 'right') {
answer += 'R';
rtemp = num;
ridx = midx;
}
}
}
}
return answer;
}
중앙에 있는 숫자를 누를때 왼손에서 중앙숫자까지 가는 거리, 오른손에서 중앙숫자까지 가는 거리를 구해서 가까운 손으로 중앙숫자를 누르게하고, 같을때는 hand의 'left', 'right'에 따라 눌러주면 되는 간단한 문제다. 추가로 왼손의 *을 10, 오른손의 #을 12로 만들어 이동거리를 구할 수 있게 만들어 줬다. 하지만 190줄이 넘는 코드를 썻었고, 13번부터 20번의 테스트케이스는 통과하지 못했었다. 수많은 조건문을 써도 통과하지 못하는 것은 부족한 논리때문이었다. 엄지손가락은 상하좌우 4가지 방향으로만 이동할 수 있으며 키패드 이동 한 칸은 거리로 1에 해당합니다.
문제를 차분히 다시읽어보니 놓친 부분이 있었다. 문제에 답이있다. 차분히 진행하자.