JAVA/Algorithm

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

nang. 2020. 12. 2. 23:06
반응형
SMALL

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

 

  • 키패드의 *과 #은 편의를 위해 순서대로 10, 12로 지정
  • 가운데 키까지의 거리가 가까운 걸로 채택
    • 좌표간 거리 구하기
    • |x1 - x2| + |y1 - y2|
      • 절대값 구하는 함수
        • Math.abs()

 

class Solution {
    public String solution(int[] numbers, String hand) {
        StringBuilder sb = new StringBuilder();
        int leftPosition = 10; // *을 10으로 둔 것
        int rightPosition = 12; // #을 12로 둔 것
        
        for(int number : numbers) {
            if(number == 1 || number == 4 || number == 7) {
                sb.append("L");
                leftPosition = number;
            } else if(number == 3 || number == 6 || number == 9) {
                sb.append("R");
                rightPosition= number;
            } else {
                int leftLength = getLength(leftPosition, number); // 좌표간 거리 구하기
                int rightLength = getLength(rightPosition, number); // 좌표간 거리 구하기
                
                if(leftLength > rightLength) { // 오른쪽이 더 가까우면
                    sb.append("R");
                    rightPosition = number;
                } else if(leftLength < rightLength) { // 왼쪽이 더 가까우면
                    sb.append("L");
                    leftPosition = number;
                } else { // 양 거리가 같으면
                    if(hand.equals("right")) {
                        sb.append("R");
                        rightPosition = number;
                    } else {
                        sb.append("L");
                        leftPosition = number;
                    }
                }
            }
        }
        
        return sb.toString();
    }

    public static int getLength(int position, int number) {

        // 0은 11로 두어도 상관 X
        position = (position == 0) ? 11 : position;
        number = (number == 0) ? 11 : number;

        int x = (position - 1) / 3; // x좌표 구하는 방법
        int y = (position - 1) % 3; // y좌표 구하는 방법

        int centerX = number / 3;
        int centerY = 1;

        // Math.abs()는 절대값
        // 좌표라고 생각하고 그 길이 구하는 것
        // |x1 - x2| + |y1 - y2|
        return Math.abs(x - centerX) + Math.abs(y - centerY);
    }
}
반응형
LIST