스마트폰 전화 키패드의 각 칸에 다음과 같이 숫자들이 적혀 있습니다.
이 전화 키패드에서 왼손과 오른손의 엄지손가락만을 이용해서 숫자만을 입력하려고 합니다.
맨 처음 왼손 엄지손가락은 * 키패드에 오른손 엄지손가락은 # 키패드 위치에서 시작하며, 엄지손가락을 사용하는 규칙은 다음과 같습니다.
1
, 4
, 7
을 입력할 때는 왼손 엄지손가락을 사용합니다.3
, 6
, 9
를 입력할 때는 오른손 엄지손가락을 사용합니다.2
, 5
, 8
, 0
을 입력할 때는 두 엄지손가락의 현재 키패드의 위치에서 더 가까운 엄지손가락을 사용합니다.순서대로 누를 번호가 담긴 배열 numbers
, 왼손잡이인지 오른손잡이인 지를 나타내는 문자열 hand
가 매개변수로 주어질 때, 각 번호를 누른 엄지손가락이 왼손인 지 오른손인 지를 나타내는 연속된 문자열 형태로 return 하도록 solution
함수를 완성해주세요.
numbers | hand | result |
---|---|---|
[1, 3, 4, 5, 8, 2, 1, 4, 5, 9, 5] | "right" | "LRLLLRLLRRL" |
[7, 0, 8, 2, 8, 3, 1, 5, 7, 6, 2] | "left" | "LRLLRRLLLRR" |
[1, 2, 3, 4, 5, 6, 7, 8, 9, 0] | "right" | "LLRLLRLLRL" |
let num = [[1, 4, 7, '*'],[2, 5, 8, 0],[3, 6, 9, '#']] //번호를 '열' 기준으로 2차원 배열
function distance(now, end){ // 현재 위치와 목적위치를 파라미터로 받는 거리계산 함수
let count = 0
let now_place = num.indexOf(num.find(a=>a.includes(now)))
let end_place = num.indexOf(num.find(a=>a.includes(end))) // 현재 위치와 목적 위치의 num 인덱스(열)을 구한다.
let col_dis = Math.abs(num[end_place].indexOf(end) - num[now_place].indexOf(now)) // 행 간의 길이
let row_dis = Math.abs(end_place - now_place) // 열 간의 길이
if(now_place == end_place) {
return col_dis // 열이 서로 같다면 행 간의 길이만 return
}
else{
return row_dis + col_dis // 열이 서로 다르다면 열 간의 길이 + 행 간의 길이를 총 길이로 return
}
}
function solution(numbers, hand) {
let left = '*'
let right = '#' // 첫 위치 설정
let answer = ''
for(let i = 0; i < numbers.length; i++){
let t = numbers[i]
if(t % 3 == 0 && t !== 0){ // 0을 제외하고 나머지가 0일 경우 오른손 위치 이동 및 'R' 추가
right = t
answer += 'R'
} else if(t % 3 == 1){ // 나머지 1일 경우 왼손 위치 이동 및 'L' 추가
left = t
answer += 'L'
} else if(t % 3 == 2 || t == 0){ // 0이거나 나머지가 2일 경우
if(distance(left, t) < distance(right, t)){
left = t
answer += 'L'
} else if(distance(left, t) > distance(right, t)){
right = t
answer += 'R' // 거리 함수 비교
} else if(distance(left, t) == distance(right, t)){
if(hand == "right"){ // 같을 경우 왼손잡이 오른손잡이 확인
right = t
answer += 'R'
}else{
left = t
answer += 'L'
}
}
}
}
return answer
}
이번 문제는 상당히 풀이가 길어졌는데 모든 경우의 수를 일일이 고려해서 풀다보니 그랬던 것 같다. 각 숫자를 열별로 담은 이차원 배열을 선언하고 시작점과 도착점의 거리를 구하는 함수를 만들었다. 그리고 for문을 돌면서 경우의 수를 하나하나 고려해주었다.