📱 문제
패드에서 왼손과 오른손의 엄지손가락만을 이용해서 숫자만을 입력하려고 합니다.
맨 처음 왼손 엄지손가락은 * 키패드에 오른손 엄지손가락은 # 키패드 위치에서 시작하며, 엄지손가락을 사용하는 규칙은 다음과 같습니다.
엄지손가락은 상하좌우 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 해주세요.📱 입출력 예
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 keyPad = [ [1,2,3], [4,5,6], [7,8,9], ['*',0,'#'] ]
- numbers 까지 다 돌고 numbers의 i 번째가 1,4,7 이면 'L', 3,6,9 이면 'R' 그것도 아니면(2,5,8) 이면?
- 이전손가락이 있는 위치와 비교.
-> 비교를 위해 이전 숫자들을 각각 빈 left/right 빈스택에 넣고 현재수와 비교한다.- 빈스택에 들어가있는 수와 현재있는 수를 빼서, left 스택이 더 작으면 'L', 아니면 'R'
- 만약 뺀 값이 서로 같으면 매개변수 hand 가 왼손잡이인지 오른손잡이인지 따져서 리턴한다.
- 배열스택에 담았으니 이 모든것을 arr.join('') 처리해서 리턴해준다.
function solution(numbers, hand) {
let arr = [];
let leftArr = [];
let rightArr = [];
for(let i = 0; i<numbers.length; i++){ debugger
if(numbers[i] === 1 ||numbers[i] === 4 || numbers[i] ===7){
arr.push('L');
leftArr = [numbers[i]];
}
else if(numbers[i] === 3 || numbers[i] === 6 || numbers[i] === 9){
arr.push('R');
rightArr = [numbers[i]];
}
else if(numbers[i] === 2 ||numbers[i] === 5 ||numbers[i] === 8){
if(Math.abs(numbers[i] - [leftArr]) > Math.abs(numbers[i] - [rightArr])){
arr.push('R')
rightArr = [numbers[i]];
}else if(Math.abs(numbers[i] - [rightArr]) > Math.abs(numbers[i] - [leftArr])){
arr.push('L');
leftArr = [numbers[i]];
}else if(Math.abs(numbers[i] - [rightArr]) === Math.abs(numbers[i] - [leftArr])){
if(hand === 'right'){
arr.push('R');
rightArr = [numbers[i]];
}else if(hand === 'left'){
arr.push('L');
leftArr = [numbers[i]];
}
}
}
}
return arr.join('');
}
크으 .. 기가막히는 하드코딩 ㅠㅠㅠㅠㅠㅠ 휴
leftArr, rightArr 라는 빈배열을 만들어서 각 키패드에 맞게 도달해주면 넣고, 그 넣은 숫자와 2,5,8 일때 비교를 하게끔 했다.
솔직히 콘솔로만 돌려봤을때 성공한줄알음.
다시 상, 하, 좌, 우를 생각해보려고 했지만 생각보다 잘 풀리지 않아서 다른코드를 참조해서 다시 풀어봤다.
const getDistance = (locatedNumber, target) => {
const keyPad = {
1: [0, 0], 2: [0, 1], 3: [0, 2],
4: [1, 0], 5: [1, 1], 6: [1, 2],
7: [2, 0], 8: [2, 1], 9: [2, 2],
'*': [3, 0], 0: [3, 1], '#': [3, 2],
}
const nowPosition = keyPad[locatedNumber];
const targetPosition = keyPad[target];
return Math.abs(targetPosition[0] - nowPosition[0]) + Math.abs(targetPosition[1] - nowPosition[1]);
};
아예 처음부터 keypad 를 객체형태의 좌표순으로 지정해서 함수로 지정한다.
필요한곳에서 해당 함수를 가져다 쓰면 되는데
function solution(numbers, hand) {
let arr = [];
let 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 left = keyPad['*'];
let right = keyPad['#'];
const locate = (left,right) => {
return Math.abs(left[0] - right[0]) + Math.abs(left[1] - right[1])
}
for(let i = 0; i<numbers.length; i++){
if(numbers[i] === 1 ||numbers[i] === 4 || numbers[i] ===7){
arr.push('L');
left = keyPad[numbers[i]]
}
else if(numbers[i] === 3 ||numbers[i]=== 6 || numbers[i] === 9){
arr.push('R');
right = keyPad[numbers[i]]
}
// if(numbers[i] === 2 ||numbers[i] === 5 ||numbers[i] === 8)
else{
let leftLocation = locate(keyPad[numbers[i]],left);
let rightLocation = locate(keyPad[numbers[i]],right);
if(leftLocation > rightLocation){
arr.push('R')
right = keyPad[numbers[i]];
}
else if(leftLocation < rightLocation){
arr.push('L');
left = keyPad[numbers[i]];
}
else{
if(hand === 'right'){
arr.push('R');
right = keyPad[numbers[i]];
}
else{
arr.push('L');
left = keyPad[numbers[i]];
}
}
}
}
return arr.join('');
}
와.. 이거 1단계 맞음..?
오기생겨서 두시간 걸려서 풀었다..
힌트를 보고 풀어봐도 객체로 코드를 다시 다 바꿔야하는 부분에서 애먹었다..
특히 함수부분은 생각치도 못했는데 사람들 천재같음 진짜.
다시 풀어봐야겠다.. 총총총..