-
[프로그래머스] JS 키패드 누르기알고리즘/프로그래머스 2022. 4. 12. 23:32
문제 이해하기
키패드를 누른 엄지손가락이 왼손인지 오른손인지를 나타내야한다.
- 엄지손가락은 상하좌우 4가지 방향으로만 이동할 수 있으며 키패드 이동 한 칸은 거리로 1에 해당.
- 왼쪽 열의 3개의 숫자 1, 4, 7을 입력할 때는 왼손 엄지손가락(Left)을 사용.
- 오른쪽 열의 3개의 숫자 3, 6, 9를 입력할 때는 오른손 엄지손가락(Right)을 사용.
- 가운데 열의 4개의 숫자 2, 5, 8, 0을 입력할 때는 두 엄지손가락의 현재 키패드의 위치에서 더 가까운 엄지손가락(Left, Right)을 사용.
- 만약 두 엄지손가락의 거리가 같다면, 오른손잡이는 오른손 엄지손가락, 왼손잡이는 왼손 엄지손가락을 사용합니다.
데이터 추상화
- *, 0, # 을 10, 12, 13으로 추상화 함
- 각 번호 별로 어떤 손으로 입력할지 추상화함
const hands = ['0','L','0', 'R','L','0', 'R','L', '0', 'R', 'L','0','R'] - 손의 위치를 기억할 pos 배열로 추상화함
const pos = [10,12]
알고리즘
- 위에서 추상화한 hands값으로 입력된 번호의 값을 리턴한다.
- 손의 위치를 변경해준다. pos 값을 갱신 한다.
- L, R이 아닌경우에는 가운데 열이며, 이 경우 각 손가락으로부터의 거리를 구해야한다.
- 각 손가락으로 부터의 거리는 3으로 나눈 몫에서 3으로 나눈 나머지값을 더한 값이다.
- 3으로 나눈 몫 : 세로 거리
- 3으로 나눈 나머지 : 가로 거리 - 각 거리가 같으면. 인자로 받은 hand값에 따라 'L', 'R'로 할지 결정한다.
function solution(numbers, hand) { var answer = ''; let hands = ['0','L','0', 'R','L','0', 'R','L', '0', 'R', 'L','0','R'] let pos = [10, 12]; // 10 , 11, 12 answer = numbers.map( ele => { if(ele === 0) ele= 11; if(hands[ele] == 'L'){ pos[0] = ele; }else if (hands[ele] == 'R' ){ pos[1] = ele; }else { let LDistance = parseInt(Math.abs(pos[0] - ele ) / 3 + Math.abs(pos[0] - ele ) % 3); let RDistance = parseInt(Math.abs(pos[1] - ele ) / 3 + Math.abs(pos[1] - ele ) % 3); if( LDistance === RDistance){ if( hand === 'left'){ pos[0] = ele; return 'L'; }else if( hand === 'right'){ pos[1] = ele; return 'R'; } }else if( LDistance > RDistance){ pos[1] = ele; return 'R'; }else if( LDistance < RDistance){ pos[0] = ele; return 'L'; } } return hands[ele]; }).join('') return answer; }
정리
- 구현 문제
- 각 번호별로 입려되는 값을 배열로 선언하여 로직을 줄일수 있다.
느낀점
- 어렵게 생각하는 것보다는 차근차근 하나씩 해나가면 문제를 쉽게 풀수 있다.
728x90'알고리즘 > 프로그래머스' 카테고리의 다른 글
[프로그래머스] JS 없는 숫자 더하기 (0) 2022.04.13 [프로그래머스] JS 크레인 인형뽑기 게임 (0) 2022.04.13 [프로그래머스] 위클리 10주차 - 교점에 별 만들기(JS) (0) 2021.10.14 [프로그래머스] 타겟 넘버 (JS) (0) 2021.10.10 [프로그래머스] 위클리 9주차 - 전력망을 둘로 나누기(JS) (0) 2021.10.09