순서대로 누를 번호가 담긴 배열 numbers, 왼손잡이인지 오른손잡이인 지를 나타내는 문자열 hand가 매개변수로 주어질 때, 각 번호를 누른 엄지손가락이 왼손인 지 오른손인 지를 나타내는 연속된 문자열 형태로 return 하도록 solution 함수를 완성해주세요.
자세한 설명은 아래의 링크를 클릭해주세요.
https://school.programmers.co.kr/learn/courses/30/lessons/67256
function solution(numbers, hand) {
var answer = '';
var button = [1,2,3,4,5,6,7,8,9,'*',0,'#'];
var map = new Map();
var row=0;
for(var i=0; i<button.length; i++){ // 버튼의 위치를 버튼을 키값으로 위치를 저장
if((i!=0) && (i%3===0)) row++;
map.set(button[i],[row,i%3]);
}
var L_position = '*'; // 왼손가락의 현위치
var R_position = '#'; // 오른손가락의 현위치
for(var i=0; i<numbers.length; i++){ //numbers배열을 순회
if(numbers[i]%3===1){ // 왼손가락으로 클릭할 경우
answer += 'L';
L_position = numbers[i]; //현위치 변경
}
else if((numbers[i]%3===0) && (numbers[i] != 0)){ //오른손가락으로 클릭할 경우
answer += 'R';
R_position = numbers[i]; //현위치 변경
}
else{ //눌러야할 숫자가 2,5,8,0일 경우
var L_distance = Math.abs(map.get(L_position)[0]-map.get(numbers[i])[0])
+ Math.abs(map.get(L_position)[1]-map.get(numbers[i])[1]);
var R_distance = Math.abs(map.get(R_position)[0]-map.get(numbers[i])[0])
+ Math.abs(map.get(R_position)[1]-map.get(numbers[i])[1]);
//각 숫자 각각의 행의 위치와 열의 위치의 차의 절댓값끼리의 합이 거리가 된다.
//거리 검사 후 거리 비교후 버튼 클릭.
if(L_distance > R_distance){
answer += 'R';
R_position = numbers[i];
}
else if(L_distance < R_distance){
answer += 'L';
L_position = numbers[i];
}
else{ // 거리가 같은경우 주손 검사
if(hand==="left"){
answer += 'L';
L_position = numbers[i];
}
else{
answer += 'R';
R_position = numbers[i];
}
}
}
}
return answer;
}
var L_distance = Math.abs(map.get(L_position)[0]-map.get(numbers[i])[0])
+ Math.abs(map.get(L_position)[1]-map.get(numbers[i])[1]);
var R_distance = Math.abs(map.get(R_position)[0]-map.get(numbers[i])[0])
+ Math.abs(map.get(R_position)[1]-map.get(numbers[i])[1]);
아마 이 부분이 설명이 필요할거 같다.
밑의 표를 보면 #의 위치는 [1,1]이고 %의 위치는 [2,2]이다. 그렇다면 표에서 이 두 문자의 거리는
절댓값(%의 행의위치 - #의 행의위치) + 절댓값(%의 열의위치 - #의 열의위치) 의 결과값이
거리가 나오게 된다. 왜냐하면 행의위치의 차의 절댓값은 두 문자의 세로거리이고
열의 차의 절댓값을 가로거리이기 때문이다.
이를 핸드폰 키보드 위치에 대입해보면 위 코드가 이해가 갈것이다.
|#|$|
|@|%|