프로그래머스 1단계 - 키패드 누르기 본문
1 단계 : 로또 최고순위와 최저순위
코딩테스트 연습 > 2020 카카오 인턴십 > 키패드 누르기
문제 설명
스마트폰 전화 키패드의 각 칸에 다음과 같이 숫자들이 적혀 있습니다.
이 전화 키패드에서 왼손과 오른손의 엄지손가락만을 이용해서 숫자만을 입력하려고 합니다.
맨 처음 왼손 엄지손가락은 *
키패드에 오른손 엄지손가락은 #
키패드 위치에서 시작하며, 엄지손가락을 사용하는 규칙은 다음과 같습니다.
- 엄지손가락은 상하좌우 4가지 방향으로만 이동할 수 있으며 키패드 이동 한 칸은 거리로 1에 해당합니다.
- 왼쪽 열의 3개의 숫자
1
,4
,7
을 입력할 때는 왼손 엄지손가락을 사용합니다. - 오른쪽 열의 3개의 숫자
3
,6
,9
를 입력할 때는 오른손 엄지손가락을 사용합니다. - 가운데 열의 4개의 숫자
2
,5
,8
,0
을 입력할 때는 두 엄지손가락의 현재 키패드의 위치에서 더 가까운 엄지손가락을 사용합니다.
만약 두 엄지손가락의 거리가 같다면, 오른손잡이는 오른손 엄지손가락, 왼손잡이는 왼손 엄지손가락을 사용합니다.
순서대로 누를 번호가 담긴 배열 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" |
입출력 예에 대한 설명
입출력 예 #1
순서대로 눌러야 할 번호가 [1, 3, 4, 5, 8, 2, 1, 4, 5, 9, 5]이고, 오른손잡이입니다.
왼손 위치 | 오른손 위치 | 눌러야 할 숫자 | 사용한 손 | 설명 |
---|---|---|---|---|
* | # | 1 | L | 1은 왼손으로 누릅니다. |
1 | # | 3 | R | 3은 오른손으로 누릅니다. |
1 | 3 | 4 | L | 4는 왼손으로 누릅니다. |
4 | 3 | 5 | L | 왼손 거리는 1, 오른손 거리는 2이므로 왼손으로 5를 누릅니다. |
5 | 3 | 8 | L | 왼손 거리는 1, 오른손 거리는 3이므로 왼손으로 8을 누릅니다. |
8 | 3 | 2 | R | 왼손 거리는 2, 오른손 거리는 1이므로 오른손으로 2를 누릅니다. |
8 | 2 | 1 | L | 1은 왼손으로 누릅니다. |
1 | 2 | 4 | L | 4는 왼손으로 누릅니다. |
4 | 2 | 5 | R | 왼손 거리와 오른손 거리가 1로 같으므로, 오른손으로 5를 누릅니다. |
4 | 5 | 9 | R | 9는 오른손으로 누릅니다. |
4 | 9 | 5 | L | 왼손 거리는 1, 오른손 거리는 2이므로 왼손으로 5를 누릅니다. |
5 | 9 | - | - |
따라서 "LRLLLRLLRRL"
를 return 합니다.
입출력 예 #2
왼손잡이가 [7, 0, 8, 2, 8, 3, 1, 5, 7, 6, 2]를 순서대로 누르면 사용한 손은 "LRLLRRLLLRR"
이 됩니다.
입출력 예 #3
오른손잡이가 [1, 2, 3, 4, 5, 6, 7, 8, 9, 0]를 순서대로 누르면 사용한 손은 "LLRLLRLLRL"
이 됩니다.
코드
function solution(numbers, hand) {
let answer = '';
let obj = {
// 배열의 첫번 째 원소 : 2와의 거리
// 배열의 두번 째 원소 : 5와의 거리
// 배열의 세번 째 원소 : 8과의 거리
// 배열의 네번 째 원소 : 0과의 거리
// *, # 있는이유는 시작부터 2,5,8,0을 누를 수 있기 때문에
1 : [1,2,3,4],
4 : [2,1,2,3],
7 : [3,2,1,2],
3 : [1,2,3,4],
6 : [2,1,2,3],
9 : [3,2,1,2],
"*" : [4,3,2,1],
"#" : [4,3,2,1],
2 : [0,1,2,3],
5 : [1,0,1,2],
8 : [2,1,0,1],
0 : [3,2,1,0],
}
let posl = '*'; // 왼손시작
let posr = '#'; // 오른손 시작
for (let n of numbers){
if(n === 1 || n === 4 || n === 7){ // 이것들은 왼손으로 눌러주면 된다.
posl = n;
answer += 'L';
}
else if(n === 3 || n === 6 || n === 9){ // 오른손
posr = n;
answer += 'R';
}
else{ // 2,5,8,0 일 때
let idx;
if(n === 2) { // 아까 말했던 배열의 첫번째 요소에 접근하기 위해 idx값을 0으로 설정
idx = 0;
}
else if(n === 5){
idx = 1;
}
else if(n === 8){
idx = 2;
}
else if(n === 0){
idx = 3;
}
// 인덱스 설정이 끝났으면, 거리를 비교해본다
// 8을 눌러야하면, 왼손 : 7, 오른손 : 3 위치에 있을 때 obj[7][2 (1) vs obj[3][2] (3)
// 따라서 왼손으로 누른다
if(obj[posl][idx] > obj[posr][idx]) {
answer += 'R';
posr = n;
}
else if(obj[posl][idx] < obj[posr][idx]){
answer += 'L';
posl = n;
}
else if(obj[posl][idx] === obj[posr][idx]){ // 거리가 같은경우에는 무슨손잡이 인가를 따져서 그 손으로 누른다.
if(hand === 'right'){
answer += 'R';
posr = n;
}
else if(hand === 'left'){
answer += 'L';
posl = n;
}
}
}
}
return answer;
}
리뷰
순서는 다음과 같다
1. 각 키패드간에 거리를 객체로 관리해준다.
2. 1,4,7은 왼손처리, 3,6,9는 오른손처리를 해주면 된다.
3. 나머지 숫자는 현재 손의 위치와 무슨손잡이인가를 따져서 가까운 거리에 있는 손으로 눌러주면 된다.
총평 : 경우의 수가 많아서 코드가 많아진 것 같다. 다른사람의 풀이를 봐도 이문제는 좀 코드가 길어지는 문제인 것 같다.
출처 : https://school.programmers.co.kr/learn/courses/30/lessons/67256?language=javascript
'알고리즘 > 1단계' 카테고리의 다른 글
프로그래머스 1단계 - 없는 숫자 더하기 (1) | 2022.08.04 |
---|---|
프로그래머스 1단계 - 크레인 인형 뽑기 게임 (2) | 2022.07.29 |
프로그래머스 1단계 - 숫자 문자열과 영단어 (2) | 2022.07.27 |
프로그래머스 1단계 - 신규 아이디 추천 (4) | 2022.07.27 |
프로그래머스 1단계 - 로또 최고순위와 최저순위 (4) | 2022.07.25 |