티스토리 뷰

https://programmers.co.kr/learn/courses/30/lessons/67256

 

코딩테스트 연습 - 키패드 누르기

[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"

programmers.co.kr

 

카카오 코딩 테스트 당시 이 문제를 풀지 못했다. 요즘 알고리즘을 공부하면서 너무 복잡하게 생각하고 어렵게 코딩하려던 게 원인이 아닐까 싶다. 문제를 보면 이해를 하고 먼저 단순하게 풀 수 있는지 확인 먼저 해야겠다.

 

이 문제를 마지막으로 level 1 문제를 완료했다. 백준 알고리즘 기초 강의를 마무리하고 level 2 문제 도전!!

 

[문제 풀이]

1. 0 ~ 9까지의 숫자만 누를 수 있다는 제약 조건이 있다.

2. 현재 숫자가 1, 4, 7이면 왼손으로 누른다.

3. 현재 숫자가 3, 6, 9이면 오른손으로 누른다.

4. 현재 숫자가 2, 5, 8, 0이면 왼손과 오른손 중 가까운 손으로 누른다. 단, 거리가 같다면 주 손잡이로 누른다.

5. 거리 계산 (double로 하지 말고 int로 하자)

  5-1. 현재 누르고 있는 숫자가 2, 5, 8, 0이면 x는 1이고 아니라면 0(1, 4 7을 누르든 3, 6, 9를 누르던 2, 5, 8, 0과 거리를 계산할 때 최대 길이는 1이기 때문이다.)을 넣는다.

  5-2. 현재 숫자가 0이라면 4 아니라면 1, 2, 3은 1을 4, 5, 6은 2를, 7, 8, 9라면 3을 반환해야 한다.

  5-3. x의 거리 차이와 y의 거리 차이의 합을 반환한다.

 

 

[소스 코드]

 

public class PressKeypad {
    private static StringBuilder answer = new StringBuilder();

    public static void main(String[] args) {
        int[] numbers = {1, 3, 4, 5, 8, 2, 1, 4, 5, 9, 5};
        String hand = "right";

        System.out.println(solution(numbers, hand));
    }

    private static String solution(int[] numbers, String hand) {
        int leftHand = 10;
        int rightHand = 12;

        for (int number : numbers) {
            if (number == 1 || number == 4 || number == 7) {
                leftHand = number;
                answer.append("L");
            } else if (number == 3 || number == 6 || number == 9) {
                rightHand = number;
                answer.append("R");
            } else {
                int leftDistance = calculateDistance(leftHand, number);
                int rightDistance = calculateDistance(rightHand, number);
                int calculate = leftDistance - rightDistance;

                if (calculate == 0) {
                    if ("right".equals(hand)) {
                        rightHand = number;
                        answer.append("R");
                    } else {
                        leftHand = number;
                        answer.append("L");
                    }
                } else if (calculate > 0) {
                    rightHand = number;
                    answer.append("R");
                } else {
                    leftHand = number;
                    answer.append("L");
                }
            }
        }

        return answer.toString();
    }

    private static int calculateDistance(int current, int number) {
        int x = 0;
        int y = calculateY(current);
        int numberX = 1;
        int numberY = calculateY(number);

        if (current == 2 || current == 5 || current == 8 || current == 0) {
            x = 1;
        }

        return numberX - x + Math.abs(y - numberY);
    }

    private static int calculateY(int number) {
        return number == 0 ? 4 : (number - 1) / 3 + 1;
    }
}
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2026/02   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
글 보관함