문제 내용
이 전화 키패드에서 왼손과 오른손의 엄지손가락만을 이용해서 숫자만을 입력하려고 합니다.맨 처음 왼손 엄지손가락은 * 키패드에 오른손 엄지손가락은 # 키패드 위치에서 시작하며, 엄지손가락을 사용하는 규칙은 다음과 같습니다.
1. 엄지손가락은 상하좌우 4가지 방향으로만 이동할 수 있으며 키패드 이동 한 칸은 거리로 1에 해당합니다.
2. 왼쪽 열의 3개의 숫자 1, 4, 7을 입력할 때는 왼손 엄지손가락을 사용합니다.
3. 오른쪽 열의 3개의 숫자 3, 6, 9를 입력할 때는 오른손 엄지손가락을 사용합니다.
4. 가운데 열의 4개의 숫자 2, 5, 8, 0을 입력할 때는 두 엄지손가락의 현재 키패드의 위치에서 더 가까운 엄지손가락을 사용합니다.
4-1. 만약 두 엄지손가락의 거리가 같다면, 오른손잡이는 오른손 엄지손가락, 왼손잡이는 왼손 엄지손가락을 사용합니다.
순서대로 누를 번호가 담긴 배열 numbers, 왼손잡이인지 오른손잡이인 지를 나타내는 문자열 hand가 매개변수로 주어질 때, 각 번호를 누른 엄지손가락이 왼손인 지 오른손인 지를 나타내는 연속된 문자열 형태로 return 하도록 solution 함수를 완성해주세요.
입출력 예
| 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" |
일단 이 문제를 푸는 방식에는 여러가지가 있겠지만 최대한 간단하게 풀기 위해서 키패드를 2차원 배열로 만들고 눌러야 할 번호와 현재 손가락이 위치하고 있는 번호간의 거리를 구해서 해결하기로 하였다.
처음에 1, 4, 7이나 3, 6, 9번은 손가락의 현재 위치와 상관없이 무조건 눌러야 할 손가락이 정해져 있기 때문에 먼저 처리를 해주고 나서 2, 5, 8, 0번을 처리를 한다. 여기서 각 손가락과 타겟 번호간의 거리를 구해야 하는데 나는 거리를 구하는 distance메서드를 따로 만들어서 아까 말한대로 2차원 배열을 통해 거리를 구하였다.
(메서드를 따로 만든건 그냥 보기편하고 이뻐서 그런거도 있고 이렇게 기능별로 메서드를 만들면 코드 유지보수할때도 훨씬 편리해진다)
distance 메서드 내에서는 반복문을 통해 인수로 받은 번호의 인덱스를 알아내고 거리를 계산한다. 여기서 그냥 인덱스로 계산을 한 이유는 문제에서 키패드간의 거리를 1로 정의하였기 때문이다. (만약 여기서 문제가 더 어렵게 나온다면 각 키패드간의 거리에 가중치를 둬서 DFS문제로 나올 수도 있으니 참고)
이렇게 거리를 측정하고 나면 그 다음에는 대소비교를 통해 어떤 손가락을 사용할지 결정하고 그대로 출력문에 더하면 된다.
그러면 아래 코드처럼 코드가 짜여질 것이다.
class Solution {
public String solution(int[] numbers, String hand) {
String answer = "";
int left=10, right=11; // 초기 손가락 위치
for(int i : numbers){ //numbers의 요소 하나씩 탐색
if(i%3==1){ // 1, 4, 7일 경우
answer+="L";
left=i;
}else if(i%3==0 && i!=0){ // 3, 6, 9일 경우
answer+="R";
right=i;
}else{ // 2, 5, 8, 0일 경우
int l_dist=distance(left,i); // 왼손가락과 타겟간의 거리
int r_dist=distance(right,i);// 오른손가락과 타겟간의 거리
if(l_dist<r_dist){
answer+="L";
left=i;
}else if(l_dist>r_dist){
answer+="R";
right=i;
}else if(l_dist==r_dist){
// 타겟과의 거리가 동일할때는 hand를 보고 판단
if(hand.equals("right")){
answer+="R";
right=i;
}else if(hand.equals("left")){
answer+="L";
left=i;
}
}
}
}
return answer;
}
public int distance(int cPos, int target){
/**
타겟과 현재 손가락 간의 거리 구하기
*/
int[][] numPad={{1,2,3}, {4,5,6}, {7,8,9}, {10,0,11}};
int cI=0;
int cJ=0;
int tI=0, tJ=0;
for(int i=0;i<4;i++){
for(int j=0;j<3;j++){
if(numPad[i][j]==cPos){
cI=i; cJ=j;
}
if(numPad[i][j]==target){
tI=i; tJ=j;
}
}
}
return Math.abs(tI-cI)+Math.abs(tJ-cJ);
}
}
이 문제는 키패드를 2차원 배열로 표현해서 거리를 구하는 방식만 결정하면 빨리 풀 수 있는 문제인거 같다.
'Algorithm > 프로그래머스' 카테고리의 다른 글
| 코딩테스트 연습 Lv1 - 2024 Kakao Winter Intership 가장 많이 받은 선물 (0) | 2024.01.05 |
|---|---|
| 코딩테스트 Lv1 PCCP 기출문제 1번 - 붕대감기 (0) | 2024.01.03 |
| 코딩테스트 연습 Lv1 신규아이디 추천 (0) | 2023.10.02 |
| 코딩테스트 연습 Lv1 달리기 경주 (0) | 2023.10.02 |