스마트폰 전화 키패드의 각 칸에 다음과 같이 숫자들이 적혀 있습니다.
이 전화 키패드에서 왼손과 오른손의 엄지손가락만을 이용해서 숫자만을 입력하려고 합니다.
맨 처음 왼손 엄지손가락은 *
키패드에 오른손 엄지손가락은 #
키패드 위치에서 시작하며, 엄지손가락을 사용하는 규칙은 다음과 같습니다.
1, 4, 7
을 입력할 때는 왼손 엄지손가락을 사용합니다.3, 6, 9
를 입력할 때는 오른손 엄지손가락을 사용합니다.2, 5, 8, 0
을 입력할 때는 두 엄지손가락의 현재 키패드의 위치에서 더 가까운 엄지손가락을 사용합니다.순서대로 누를 번호가 담긴 배열 numbers, 왼손잡이인지 오른손잡이인 지를 나타내는 문자열 hand가 매개변수로 주어질 때, 각 번호를 누른 엄지손가락이 왼손인 지 오른손인 지를 나타내는 연속된 문자열 형태로 return 하도록 solution 함수를 완성해주세요.
L
, 오른손 엄지손가락을 사용한 경우는 R
을 순서대로 이어붙여 문자열 형태로 return 해주세요.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" |
문제를 풀기 전에 숫자 2, 5, 8, 0을 누를 경우 두 엄지손가락의 거리를 비교하려면 맨하탄 거리
에 대해 알고 있어야 한다.
L1 Distance라고 불린다.
도시의 골목길(블록)을 걸을 때와 모습이 유사하여 이름이 붙었다.
빨강색 , 파랑색, 노랑색 선 : 거리가 동일하다.
공식
각 차원의 절대값 차의 합
let a = [0, 4];
let b = [3, 0];
function manhattanDistance(a, b) {
let distance = 0;
for (let i = 0; i < a.length; i++) {
distance += Math.abs(a[i] - b[i]) // Math.abs => 절대값을 구함
}
return distance
}
manhattanDistance(a, b) // 7
각 차원의 차를 제곱해서 모두 더한 값의 제곱근
let a = [0, 4];
let b = [3, 0];
function euclideanDistance(a, b) {
let distance = 0;
for (let i = 0; i < a.length; i++) {
distance += Math.pow(Math.abs(a[i] - b[i]), 2) // 제곱의 합
}
return Math.sqrt(distance) // 제곱근
}
euclideanDistance(a, b) // 5
const finger = {L: [1, 4, 7], R: [3, 6, 9]}
const location = [[0, 0], [0, 1], [0, 2], [1, 0], [1, 1], [1, 2], [2, 0], [2, 1], [2, 2], [3, 0], [3 ,1], [3, 2]]
function solution(numbers, hand) {
let left = 10
let right = 12
let answer = "";
numbers.forEach((number, idx) => {
if (finger.L.includes(number)) {
answer += "L"
left = number
} else if (finger.R.includes(number)) {
answer += "R"
right = number
} else {
if (number === 0) number = 11
if (distance(location[number-1], location[left-1]) > distance(location[number-1], location[right-1])) {
answer += "R"
right = number
} else if (distance(location[number-1], location[left-1]) < distance(location[number-1], location[right-1])) {
answer += "L"
left = number
} else {
if (hand === "right") {
answer += "R"
right = number
} else {
answer +="L"
left = number
}
}
}
})
function distance(x1, x2) {
let distance = 0;
for (let i = 0; i < x1.length; i++) {
distance += Math.abs(x1[i] - x2[i])
}
return distance
}
return answer
}
문제는 생각보다 쉽지만 거리 구하는 방법에 대해 모르면 못푸는 문제다..!