1. 문제
이 전화 키패드에서 왼손과 오른손의 엄지손가락만을 이용해서 숫자만을 입력하려고 합니다.
맨 처음 왼손 엄지손가락은 * 키패드에 오른손 엄지손가락은 # 키패드 위치에서 시작하며, 엄지손가락을 사용하는 규칙은 다음과 같습니다.
- 엄지손가락은 상하좌우 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 해주세요.
2. 풀이
function solution(numbers, hand) {
var answer = '';
let coor = { //각 번호의 좌표를 미리 입력한다
0:[3,1],
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],
'#':[3,2]
}
let distance = (a,b)=>{ //맨해튼거리 공식을 함수로 구현 distance = |x1-y1| + |x2-y2|
return (Math.abs(coor[b][0] - coor[a][0]) +
Math.abs(coor[b][1] - coor[a][1]))
}
let nowR = `#`; //초기 오른손 위치
let nowL = `*`; //초기 왼손 위치
for(i in numbers){
if(numbers[i] === 1 || numbers[i] === 4 || numbers[i] === 7){ //1,4,7 경우
answer+= 'L'; // answer에 누적해준다
nowL = numbers[i] //현재손의 위치를 변경해준다.
}
else if(numbers[i] === 3|| numbers[i] === 6 || numbers[i] === 9){ //3,6,9 경우
answer+= 'R';
nowR = numbers[i]
}
else{
let 왼까지거리 = distance(numbers[i],nowL);
let 오른까지거리 = distance(numbers[i],nowR);
if(왼까지거리 > 오른까지거리){ //오른손
nowR = numbers[i];
answer+='R'
}
else if(오른까지거리 > 왼까지거리){ //왼손
nowL = numbers[i]
answer+='L'
}
else if(오른까지거리 === 왼까지거리){ //같을때
if(hand === 'right'){ //오른손잡이
nowR = numbers[i];
answer+='R'
}
else if(hand === 'left'){ //왼손잡이
nowL = numbers[i];
answer+='L'
}
else{
console.log('버그다')
}
}
}
}
return answer;
}
3. 알아야할 사항
1) 맨해튼 거리 :
- 문제에서 각 손은 위아래/좌우 만 움직일 수 있다고 했으므로, 맨해튼거리를 이용해서 거리를 계산해야한다.
시작 1 | 2 | |
3 | 4 | |
도착 5 |
맨해튼거리(한칸씩 이동하면서 가는거다)
시작 1 | ||
2 | ||
도착 3 |
유클리드거리
'ComputerScience > 알고리즘, 프로그래머스' 카테고리의 다른 글
[Lv.1] 문자열 나누기 (0) | 2023.02.05 |
---|---|
[Lv.1] 크레인 인형뽑기 게임 (카카오 인턴 코딩테스트, 예외처리 실수) (0) | 2023.02.03 |
[Lv.1] 체육복 (JS 한글변수의 힘) (1) | 2023.02.02 |
[Lv.1] 과일 장수 (예제로 알아보는 JS 배열의 시간복잡도) (1) | 2023.02.02 |
[Lv.1] 다트게임(정규식, string메소드, 조건반복문 혼합) (카카오) (1) | 2023.02.02 |
댓글