문제 번호
알고리즘 분류
구현?
문제 풀이
문제에서 주어진 키패드의 모양을 keyPad라는 배열로 나타냈다. 배열의 각 좌표가 나타내는 값은 문제에서 주어진 것과 동일하다. ' 1 2 3 // 4 5 6 ........' 순서. [0,0]은 키패드의 '1' 이다.
let keyPad = [ [0,0], [1,0], [2,0],
[0,1], [1,1], [2,1],
[0,2], [1,2], [2,2],
[0,3], [1,3], [2,3]
];
문제에서 왼손으로만 누르는 번호들과 오른손으로만 누르는 번호들을 정해줬기 때문에 해당 번호들을 먼저 처리해준다.
let num = numbers[i] === 0 ? 10 : Number((numbers[i])-1);
let next = keyPad[num];
if(numbers[i] === 1 || numbers[i] === 4 || numbers[i] === 7){
left = next;
answer += 'L';
continue;
}
else if(numbers[i] === 3 || numbers[i] === 6 || numbers[i] === 9){
right = next;
answer += 'R';
continue;
}
이후에 등장하는 숫자들은 좌표를 기준으로 거리를 계산하여 더 가까운 거리에 있는 손가락으로 누르도록 했다.
이때 놓쳤던 TestCase가 있다. 왼손이 키패드 '4'에 있고 오른손이 키패드 '2'에 있고 8을 눌러야하는 경우를 생각해보자. 문제에서 주어진 거리계산 방법대로면 양손 모두 '2'의 거리만큼 떨어져있다. 하지만 단순 거리계산으로 하면 왼손이 더 가깝게 있는 것으로 판단한다. 그래서 단순거리 계산을 한뒤에 Math.ceil() 을 사용하여서 이러한 문제를 방지하였다.
let distanceLeft = Math.ceil(Math.sqrt((next[0] - left[0])**2 + (next[1] - left[1])**2));
let distanceRight = Math.ceil(Math.sqrt((next[0] - right[0])**2 + (next[1] - right[1])**2));
* 다른분들의 풀이를 참고하였는데 abs를 사용하여 절대값을 활용하면 문제에서 주어진 방법대로 거리를 계산할 수 도 있다.
Math.abs(next[0] - right[0]) + Math.abs(next[1] - right[1]);
이후에는 문제에서 주어진 [제한사항]을 따라서 answer에 정답을 추가해주면 된다.
// 왼손이 더 가까운경우.
if(distanceLeft < distanceRight){
left = next;
answer += 'L';
}
// 오른손이 더 가까운경우.
else if(distanceRight < distanceLeft){
right = next;
answer += 'R';
}
// 양손의 거리가 같은경우.
else if(distanceLeft === distanceRight){
// 사용자가 왼손잡이 일때.
if(hand === 'left'){
left = next;
answer += 'L';
}
// 사용자가 오른손잡이 일때.
else if(hand === 'right'){
right = next;
answer += 'R';
}
}
전체코드
function solution(numbers, hand) {
var answer = '';
let keyPad = [ [0,0], [1,0], [2,0],
[0,1], [1,1], [2,1],
[0,2], [1,2], [2,2],
[0,3], [1,3], [2,3]
];
let left = keyPad[9];
let right = keyPad[11];
for(let i=0; i<numbers.length; i++){
let num = numbers[i] === 0 ? 10 : Number((numbers[i])-1);
let next = keyPad[num];
if(numbers[i] === 1 || numbers[i] === 4 || numbers[i] === 7){
left = next;
answer += 'L';
continue;
}
else if(numbers[i] === 3 || numbers[i] === 6 || numbers[i] === 9){
right = next;
answer += 'R';
continue;
}
let distanceLeft = Math.ceil(Math.sqrt((next[0] - left[0])**2 + (next[1] - left[1])**2));
let distanceRight = Math.ceil(Math.sqrt((next[0] - right[0])**2 + (next[1] - right[1])**2));
// 왼손이 더 가까운경우.
if(distanceLeft < distanceRight){
left = next;
answer += 'L';
}
// 오른손이 더 가까운경우.
else if(distanceRight < distanceLeft){
right = next;
answer += 'R';
}
// 양손의 거리가 같은경우.
else if(distanceLeft === distanceRight){
// 사용자가 왼손잡이 일때.
if(hand === 'left'){
left = next;
answer += 'L';
}
// 사용자가 오른손잡이 일때.
else if(hand === 'right'){
right = next;
answer += 'R';
}
}
}
return answer;
}
특이사항
'Algorithm > Programmers' 카테고리의 다른 글
[JS][프로그래머스LV1]크레인 인형 뽑기 (0) | 2021.09.03 |
---|---|
[JS][프로그래머스]숫자 문자열과 영단어 (0) | 2021.08.31 |
[JS][프로그래머스]폰켓몬 (0) | 2021.08.30 |
[JS][프로그래머스]실패율 (0) | 2021.08.30 |
[JS][프로그래머스]3진법 뒤집기 (0) | 2021.08.30 |