본문 바로가기

Programmers

[Java] 프로그래머스 : 키패드 누르기

 

📄 문제

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

💻 코드

package programmers;

public class Lv1_Kakao_220712 { // 키패드 누르기
	//도움 코드
    public static void main(String[] args) {
        int[] numbers = {7, 0, 8, 2, 8, 3, 1, 5, 7, 6, 2};
        String hand = "left";
        System.out.println(solution(numbers, hand));

    }

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

        StringBuilder sb = new StringBuilder(); // 2

        for (int i = 0; i < numbers.length; i++) { // 3
            if (numbers[i] == 1 || numbers[i] == 4 || numbers[i] == 7) {
                sb.append("L");
                left = numbers[i];
            } else if (numbers[i] == 3 || numbers[i] == 6 || numbers[i] == 9) {
                sb.append("R");
                right = numbers[i];
            } else { // 4
                if (numbers[i] == 0) {
                    numbers[i] = 11;
                }
                int leftNumber = (Math.abs(numbers[i] - left) / 3) + (Math.abs(numbers[i] - left) % 3);
                int rightNumber = (Math.abs(numbers[i] - right) / 3) + (Math.abs(numbers[i] - right) % 3);

                if (leftNumber > rightNumber) { // 5
                    sb.append("R");
                    right = numbers[i];
                } else if (leftNumber < rightNumber) {
                    sb.append("L");
                    left = numbers[i];
                } else { // 6
                    if (hand.equals("right")) {
                        sb.append("R");
                        right = numbers[i];
                    } else {
                        sb.append("L");
                        left = numbers[i];
                    }
                }
            }
        }
        answer = sb.toString();
        return answer;
    }
}

📌 풀이

- 카카오 문제라서 그런지 문제 이해할 때는 어렵게 느껴졌지만.. 막상 코드 보니 엄청 어려운 수준은 아니었던 거 같다.. (참고해가며 풀어 보고, 스스로 다시 한번 풀어 보았다... 아직 갈 길이 먼 프린이..🥲)

  1. 왼쪽과 오른쪽 시작이 * 과 #이라고 한다. 그래서 나는 1~12까지 순차적으로 값을 주면 될 것으로 생각하여 left = 10, right = 12라는 값을 초기값으로 지정하여 로직을 작성했다.
  2. L과 R을 더해 출력하기 위하여 StringBuilder 메서드를 사용했다.
  3. 파라미터로 받은 배열 길이만큼 반복하는 반복문을 만들고, 1, 4, 7 이 해당하면 빌더에 L 저장하고 해당하는 숫자를 left변수에 저장한다. 마찬가지로 3, 6, 9 가 나오면 빌더에 R 저장하고 right에 해당하는 숫자 저장
    • 1, 4, 7과 3, 6, 9는 구하기 쉬웠지만, 2, 5, 8, 0을 구하기가 조금 헷갈렸던 거 같다. 우선 가운데 숫자를 가져오기 위해 left 또는 right 저장한다. 이유는 제한사항에 왼손과 오른손 중 더 작은 숫자를 고르기 위함이다.
  4. 그 후 무슨 값이 더 큰지 모르므로 절댓값을 기준으로 거리를 구해서 합하여 값을 구해준다.
    • 각 번호들의 위아래는 3의 차이이다. 그리고 이동 거리는 1 각 번호들의 양 옆은 1의 차이이다. 그리고 이동 거리도 1
    • 그럼 눌러야 하는 키패드 - 왼손의 위치를 3으로 나눈 몫 + 3으로 나눈 나머지는 손에서 키패드 간의 거리를 나타낼 수 있다.
  5. 구한 값이 더 작으면  해당하는 R, L을 빌더에 저장하고, 그 값을 전에 변수에 저장한다.
  6. 마지막 제한사항으로 두 개가 같으면 파라미터로 받은 hand 가 right 또는 left 면 그 값을 빌더와 이전 변수에 저장한다.