순간을 기록으로

[Java] 키패드 누르기 본문

Problem Solving

[Java] 키패드 누르기

luminous13 2022. 1. 13. 12:47

문제

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

주의할 점

거리값을 구하기 위해서는 키패드의 위치를 2차원 배열과 인덱스를 사용해야된다. 그리고 키패드가 0일 때 처리해주는 것도 필요하다.

 

 

코드

public class Solution {
    public String solution(int[] numbers, String hand) {
        String answer = "";
        StringBuilder sb = new StringBuilder();

        int left_xPos = 0;
        int left_yPos = 3;
        int right_xPos = 2;
        int right_yPos = 3;

        for (int x : numbers) {
            if (x == 1 || x == 4 || x == 7) {
                sb.append("L");
                left_xPos = 0;
                left_yPos = x/3;
            }
            else if (x == 3 || x == 6 || x == 9) {
                sb.append("R");
                right_xPos = 2;
                right_yPos = x/3 - 1;
            }
            else if (x == 2 || x == 5 || x == 8 || x == 0) {
                if (x == 0)
                    x += 11;
                int target_xPos = 1;
                int target_yPos = x/3;
                int leftDistance = Math.abs(target_xPos - left_xPos) + Math.abs(target_yPos - left_yPos);
                int rightDistance = Math.abs(target_xPos - right_xPos) + Math.abs(target_yPos - right_yPos);

                if (leftDistance < rightDistance) {
                    sb.append("L");
                    left_xPos = 1;
                    left_yPos = x/3;
                }
                else if(leftDistance > rightDistance) {
                    sb.append("R");
                    right_xPos = 1;
                    right_yPos = x/3;
                } else {
                    if (hand.equals("left")) {
                        sb.append("L");
                        left_xPos = 1;
                        left_yPos = x/3;
                    } else {
                        sb.append("R");
                        right_xPos = 1;
                        right_yPos = x/3;
                    }
                }

            }
        }
        answer = sb.toString();

        return answer;
    }

    public static void main(String[] args) {
        Solution s = new Solution();

        int[] numbers1 = {7, 0, 8, 2, 8, 3, 1, 5, 7, 6, 2};
        System.out.println(s.solution(numbers1, "left"));

        int[] numbers2 = {1, 2, 3, 4, 5, 6, 7, 8, 9, 0};
        System.out.println(s.solution(numbers2, "right"));
    }
}

느낀 점

오랫동안 못풀었는데 배열과 인덱스 개념을 이용해서 풀었다. 

왼손과 오른손의 위치를 저장하기 위해서는 변수를 설정해야하고 x,y 값을 저장해야되니 2차원 배열로 하면 더 좋을 것이다. 거리는 각 좌표를 x끼리, y끼리 뺀 다음 절댓값을 취해주면 된다.

'Problem Solving' 카테고리의 다른 글

[Java] 소수만들기  (0) 2022.01.13
[Java] 없는 숫자 더하기  (0) 2022.01.13
[Java] 공주구하기  (0) 2022.01.12
[Java] 연속된 자연수의 합  (0) 2022.01.12
[JAVA] 신규 아이디 추천  (0) 2022.01.12
Comments