study record

[프로그래머스-자바] 키패드 누르기 (2020카카오인턴십) 본문

알고리즘

[프로그래머스-자바] 키패드 누르기 (2020카카오인턴십)

asong 2021. 4. 23. 21:17

키패드 누르기 문제 풀이

  • Math.abs() 라는 절댓값 얻는 메소드를 처음으로 사용해 보았다.
  • 키패드를 좌표위의 점으로 인식하여 거리를 계산해보는 로직을 짜보았다.
public class keypad {

    public static String solution(int[] numbers, String hand) {
        StringBuilder answer = new StringBuilder();
        int leftPoint = 10;
        int rightPoint = 12;

        for (int i = 0; i < numbers.length; i++) {
            if (numbers[i] == 1 || numbers[i] == 4 || numbers[i] == 7) {
                answer.append("L");
                leftPoint = numbers[i];
            } else if (numbers[i] == 3 || numbers[i] == 6 || numbers[i] == 9) {
                answer.append("R");
                rightPoint = numbers[i];
            } else {
                int leftLength = getLength(leftPoint, numbers[i]);
                int rightLength = getLength(rightPoint, numbers[i]);
                if (leftLength > rightLength) {
                    answer.append("R");
                    rightPoint = numbers[i];
                } else if (leftLength < rightLength) {
                    answer.append("L");
                    leftPoint = numbers[i];
                } else {
                    if (hand.contains("left")) {
                        answer.append("L");
                        leftPoint = numbers[i];
                    } else {
                        answer.append("R");
                        rightPoint = numbers[i];
                    }
                }
            }
        }

        return answer.toString();
    }

    public static int getLength(int point, int number) {
        int length = 0;

        point = (point == 0) ? 11 : point;
        number = (number == 0) ? 11 : number;

        int pointX = point % 3;
        int numberX = number % 3;
        if (pointX == 0) {
            pointX = 3;
        }
        if (numberX == 0) {
            numberX = 3;
        }
        int pointY = (point + 2) / 3;
        int numberY = (number + 2) / 3;

        length = Math.abs(pointX - numberX) + Math.abs(pointY - numberY);
        return length;

    }
}