티스토리 뷰

 

 

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

[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

왼손을 쓸지 오른손을 쓸지를 결정해주는 알고리즘을 만들어줘야 한다. (getDistance)

 

class Solution {
    public String solution(int[] numbers, String hand) {
        hand = hand.equals("right")?"R":"L";

        StringBuilder sb = new StringBuilder();
        Thumb leftThumb = new Thumb(3,0);
        Thumb rightThumb = new Thumb(3,2);
        for(int number : numbers) {
            char ch = thumbPick(number);
            int [] thumbLocation = getThumbLocation(number);
            if(ch != 'N') {
                sb.append(ch);
                if(ch =='L') {
                    leftThumb.setThumb(thumbLocation[0], thumbLocation[1]);
                } else {
                    rightThumb.setThumb(thumbLocation[0], thumbLocation[1]);
                }
                continue;
            }
            int leftThumbDistance = leftThumb.getDistance(thumbLocation[0],thumbLocation[1]);
            int rightThumbDistance = rightThumb.getDistance(thumbLocation[0],thumbLocation[1]);
            if(leftThumbDistance == rightThumbDistance) {
                sb.append(hand);
                if(hand.equals("L")) {
                    leftThumb.setThumb(thumbLocation[0], thumbLocation[1]);
                } else {
                    rightThumb.setThumb(thumbLocation[0], thumbLocation[1]);
                }
            } else if(leftThumbDistance > rightThumbDistance) {
                sb.append("R");
                rightThumb.setThumb(thumbLocation[0], thumbLocation[1]);
            } else {
                sb.append("L");
                leftThumb.setThumb(thumbLocation[0], thumbLocation[1]);
            }

        }
        return sb.toString();
    }

    class Thumb {
        int i;
        int j;

        Thumb(int i, int j) {
            this.i = i;
            this.j = j;
        }

        int getDistance(int i, int j) {
            return Math.abs(this.i - i) + Math.abs(this.j - j);
        }

        void setThumb(int i, int j) {
            this.i = i;
            this.j = j;
        }
    }

    char thumbPick(int number) {
        if(number == 1 || number == 4 || number == 7){
            return 'L';
        }
        else if(number == 3 || number == 6 || number == 9) {
            return 'R';
        }
        else {
            return 'N';
        }
    }

    int[] getThumbLocation(int number) {
        int[] answer = new int[2];
        switch (number) {
            case 1:
                answer[0] = 0;
                answer[1] = 0;
                break;
            case 2:
                answer[0] = 0;
                answer[1] = 1;
                break;
            case 3:
                answer[0] = 0;
                answer[1] = 2;
                break;
            case 4:
                answer[0] = 1;
                answer[1] = 0;
                break;
            case 5:
                answer[0] = 1;
                answer[1] = 1;
                break;
            case 6:
                answer[0] = 1;
                answer[1] = 2;
                break;
            case 7:
                answer[0] = 2;
                answer[1] = 0;
                break;
            case 8:
                answer[0] = 2;
                answer[1] = 1;
                break;
            case 9:
                answer[0] = 2;
                answer[1] = 2;
                break;
            case 0:
                answer[0] = 3;
                answer[1] = 1;
                break;
            default:
                answer[0] = 100;
                answer[1] = 100;
                break;
        }
        return answer;
    }
}

굳이 클래스까지 할 필요없이 배열을 더 활용했다면 메모리도 절약할 수 있었을 것 같다.

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
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 29 30
글 보관함