키패드 누르기

SSO·2022년 1월 30일
0

Coding Test & Algorithm

목록 보기
2/17
post-thumbnail

문제 요약

  1. 엄지손가락은 상하좌우 4가지 방향으로만 이동할 수 있으며 키패드 이동 한 칸은 거리로 1에 해당합니다.
  2. 왼쪽 열의 3개의 숫자 147을 입력할 때는 왼손 엄지손가락을 사용합니다.
  3. 오른쪽 열의 3개의 숫자 369를 입력할 때는 오른손 엄지손가락을 사용합니다.
  4. 가운데 열의 4개의 숫자 2580을 입력할 때는 두 엄지손가락의 현재 키패드의 위치에서 더 가까운 엄지손가락을 사용합니다.4-1. 만약 두 엄지손가락의 거리가 같다면, 오른손잡이는 오른손 엄지손가락, 왼손잡이는 왼손 엄지손가락을 사용합니다.

        입력할 숫자                     hand            answer

[1, 3, 4, 5, 8, 2, 1, 4, 5, 9, 5]	    "right"	      "LRLLLRLLRRL"
  • 누를 숫자가 1, 3, 7 / 2, 5, 8, 0 / 3, 6, 9 일 경우로 크게 나눠서 시작
  • 1, 3, 7 이면 answer + "L" / 3, 6, 9 이면 answer + "R" / left, right 각각 numbers[i]로 업데이트
  • 2, 5, 8, 0 이면 왼손, 오른손과의 거리가 각각 필요하다 (→ 공식구하기)
  • 왼손과의 거리가 더 크면 오른손으로, 그 반대면 왼손으로, 거리가 같으면 hand를 따라 누른다.

첫 번째 코드 - !실패!

public class Keypad {
    public static String solution(int[] numbers, String hand) {
        String answer = "";
        int left = 10; // = *
        int right = 12; // = #

        for(int i = 0; i < numbers.length; i++){

            if(numbers[i]%3 == 1){
                // 1, 4, 7 (3으로 나눠 나머지가 1인 숫자)라면 왼손으로 누른다
                answer = answer + "L";
                left = numbers[i];

            }else if(numbers[i]%3 == 0){
                // 3, 6, 9 : 오른손으로 누른다
                answer = answer + "R";
                right = numbers[i];

            }else{
                // 2, 5, 8, 0 : 거리를 계산한 후 가까운 손으로 누른다
                // 왼손, 오른손과의 거리 구하기
                if(Math.abs(numbers[i]-left) > Math.abs(numbers[i]-right)){
                    answer = answer + "R";
                    right = numbers[i];
                }else if(Math.abs(numbers[i]-left) < Math.abs(numbers[i]-right)){
                    answer = answer + "L";
                    left = numbers[i];
                }else{
                    if(hand.equals("Right")){
                        answer = answer + "R";
                        right = numbers[i];
                    }else{
                        answer = answer + "L";
                        left = numbers[i];
                    }
                }
            }
        }
        return answer;
    }
   
}

위의 코드가 실패하는 이유
⇒ 만약 왼손 또는 오른손의 위치가 2, 5, 8 , 0중 하나에 위치할 경우 위의 작성한 거리 계산 결과에 따른 실행 결과가 다르게 된다. 예를 들어 왼손이 5에 있고 오른손이 9에 있고 8을 누르려고 한다고 생각해보자. 위의 코드대로면 왼손과의 거리는 3, 오른손과의 거리는 1이된다. 하지만 키패드 상에서 거리는 모두 1이므로 hand를 따라 누르게 된다. 이 경우를 생각해서 다시 코드를 짜야한다!!

정답 코드

public class Keypad {
    public static String solution(int[] numbers, String hand) {
        String answer = "";
        int left = 10; // = *
        int right = 12; // = #

        for(int i = 0; i < numbers.length; i++){

            if(numbers[i]==0){
                // 거리 계산을 위해 0을 11로 치환
                numbers[i] = 11;
            }

            if(numbers[i]%3 == 1){
                // 1, 4, 7 (3으로 나눠 나머지가 1인 숫자)라면 왼손으로 누른다
                answer = answer + "L";
                left = numbers[i];

            }else if(numbers[i]%3 == 0){
                // 3, 6, 9 : 오른손으로 누른다
                answer = answer + "R";
                right = numbers[i];

            }else{
                // 2, 5, 8, 0 : 거리를 계산한 후 가까운 손으로 누른다

                // 왼손, 오른손과의 거리 구하기
                int left_dis = Math.abs((left-numbers[i]))/3 + Math.abs((left-numbers[i]))%3;
                int right_dis = Math.abs((right-numbers[i]))/3 + Math.abs((right-numbers[i]))%3;

                if(right_dis > left_dis){
                    answer = answer + "L";
                    left = numbers[i];
                }else if(right_dis < left_dis){
                    answer = answer + "R";
                    right = numbers[i];
                }else{
                    if(hand.equals("left")){
                        answer = answer + "L";
                        left = numbers[i];
                    }else{
                        answer = answer + "R";
                        right = numbers[i];
                    }
                }
            }
        }
        return answer;
    }

}

!Point!

  • 거리 계산을 위해 numbers[i]가 0이라면 11로 치환하고 시작한다.
    → 이 if 문을 처음부터 검사하고 했어야 하는데 else문 안에 넣었다가 중간에 엄청 해맸다,,
  • 키패드와 손 사이의 거리 구하기 공식
    → 손이 위치한 숫자에서 누를 숫자를 뺀 절대값을 3으로 나눈 몫과 나머지를 더하면 거리가 계산된다.
profile
👩🏻‍💻👊🏻⭐️

0개의 댓글