코린이의 소소한 공부노트

[프로그래머스/Lv.1] 키패드 누르기 본문

코딩테스트 풀이/JAVA

[프로그래머스/Lv.1] 키패드 누르기

무지맘 2022. 11. 21. 14:50

1. Input

1) 순서대로 누를 번호가 담긴 배열 numbers

2) 왼손잡이인지 오른손잡이인 지를 나타내는 문자열 hand

3) 왼손, 오른손 엄지손가락만을 이용해서 숫자 입력

4) 키패드의 모양

1 2 3

4 5 6

7 8 9

* 0 #

5) 왼손 엄지는 *에서, 오른손 엄지는 #에서 시작

 

2. Output

1) 각 번호를 누른 엄지손가락이 왼손인 지 오른손인 지를 나타내는 연속된 문자열

2) 엄지손가락 사용 규칙

  - 엄지손가락은 상하좌우 4가지 방향으로만 이동할 수 있으며 키패드 이동 한 칸은 거리로 1에 해당한다.

  - 왼쪽 열의 3개의 숫자 1, 4, 7을 입력할 때는 왼손 엄지손가락을 사용한다.

  -  오른쪽 열의 3개의 숫자 3, 6, 9를 입력할 때는 오른손 엄지손가락을 사용한다.

  - 가운데 열의 4개의 숫자 2, 5, 8, 0을 입력할 때는 두 엄지손가락의 현재 키패드의 위치에서 더 가까운 엄지손가락을 사용한다. 이때 두 엄지손가락의 거리가 같다면, 오른손잡이는 오른손 엄지손가락, 왼손잡이는 왼손 엄지손가락을 사용한다.

 

3. Constraint

1) numbers 배열의 크기는 1 이상 1,000 이하

2) numbers 배열 원소의 값은 0 이상 9 이하인 정수

3) hand"left" 또는 "right"이고, "left"는 왼손잡이, "right"는 오른손잡이를 의미한다.

4) 왼손 엄지손가락을 사용한 경우는 L, 오른손 엄지손가락을 사용한 경우는 R을 순서대로 이어붙여 문자열 형태로 반환

 

4. Example

Input: numbers={1, 3, 4, 5, 8, 2, 1, 4, 5, 9, 5}, hand=“right” -> Output: "LRLLLRLLRRL"

설명:

5. Code

1) 첫 코드(2022/??)

String answer = "";        
int i=0;
int[] lefthand = {3,0};
int[] righthand = {3,2};
int num;
boolean isRight = hand.equals("right") ? true : false;
int[] dright, dleft;

while(i< numbers.length) {
    num = numbers[i];
    switch(num) {
        // 1,4,7은 무조건 왼손
        case 1 :
            lefthand[0] = 0; lefthand[1] = 0;
            answer += "L"; break;
        case 4 :
            lefthand[0] = 1; lefthand[1] = 0;
            answer += "L"; break;
        case 7 :
            lefthand[0] = 2; lefthand[1] = 0;
            answer += "L"; break;
        // 3, 6,9는 무조건 오른손
        case 3 :
            righthand[0] = 0; righthand[1] = 2;
            answer += "R"; break;
        case 6 :
            righthand[0] = 1; righthand[1] = 2;
            answer += "R"; break;
        case 9 :
            righthand[0] = 2; righthand[1] = 2;
            answer += "R"; break;
        // 2,5,8,0은 거리 계산 후 적용
        default :
            dright = calDistance(righthand, num);
            dleft = calDistance(lefthand, num);
            if(dleft[2] > dright[2]) { // 오른손이 가까움
                righthand[0] = dright[0]; righthand[1] = dright[1];
                answer += "R"; break;
            }
            else if(dleft[2] < dright[2]) { // 왼손이 가까움
                lefthand[0] = dleft[0]; lefthand[1] = dleft[1];
                answer += "L"; break;
            }
            else { // 오른손, 왼손이 같음
                if(isRight) {
                    righthand[0] = dright[0]; righthand[1] = dright[1];
                    answer += "R"; break;
                }
                else {
                    lefthand[0] = dleft[0]; lefthand[1] = dleft[1];
                    answer += "L"; break;
                }        			
            } 
    } //switch문 끝    	
    i++;
} // while문 끝
return answer;

// 거리 계산 메서드
static int[] calDistance(int[] hand, int n) {
    int[] result = {3, 1, 0}; // 다음 입력이 0일때가 기본위치. 거리 기본값은 0
    if(n != 0) result[0] = (int)(n/3);
    result[2] = Math.abs(result[0]-hand[0]) + Math.abs(result[1]-hand[1]);
    return result; // 손이 움직일 위치의 행, 열, 거리
}