코딩테스트/Java

(2019 카카오) 키패드 누르기 Java

SK_MOUSE 2020. 12. 23. 15:58
반응형

 

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

 

필자가 작성한 코드는 손가락을 객체로 만들어서 Left, Right 손가락의 위치를 업데이트하는 방식으로 만들었다.

class Finger {
        int num, line;

        Finger(int line, int num) {
            this.line = line;
            this.num = num;
        }

        int plusColumn() {
            if (num == 2 || num == 5 || num == 8 || num == 0) {
                return 0;
            } else return 1;
        }
    }

finger의 현재 행은 line이고, 구체적인 실제 숫자는 num에 들어간다.

해당 객체의 plusColumn은 손가락의 위치가 가운데열에있으면 0을 리턴, 아니면 1을 리턴해서 가로방향 움직임을 뜻한다.

 

 

잠깐 고민한 점 : 행 위치를 return하는 메소드.

int findline(int finger) {
        if (finger <= 3 && finger >= 1) {
            return 0;
        } else if (finger >= 4 && finger <= 6) {
            return 1;
        } else if (finger >= 7 && finger <= 9) {
            return 2;
        } else if (finger == 0 || finger == 10 || finger == 11) {//10, 11== * #
            return 3;
        } else {
            return 0;
        }
    }

*,#을 어떻게 처리해서 처음 위치를 어떻게 잡느냐였는데, 임의로 10,11이라는 숫자를 부여해서 해당값일때는 0이랑 같은 행으로 처리했다.

 

 

 

if문은 크게 세가지로 나눈다.

1. 왼쪽열, 즉 왼손만 누를수 있는 부분

2. 오른쪽열, 즉 오른손만 누를수 있는 부분

3. 가운데열, 양손중 비교해야되는 부분 => 세부적인 if문으로 들어간다.

 

 

전체코드


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

        Finger Lfinger = new Finger(3, 10);
        Finger Rfinger = new Finger(3, 11);

        for (int i = 0; i < numbers.length; i++) {
            int valLine = findline(numbers[i]);
            //2580일때
            if (numbers[i] == 1 || numbers[i] == 4 || numbers[i] == 7) {//왼쪽라인or오른쪽라인인경우
                Lfinger.num = numbers[i];
                Lfinger.line = valLine;
                answer += "L";
            } else if (numbers[i] == 3 || numbers[i] == 6 || numbers[i] == 9) {//왼쪽라인or오른쪽라인인경우
                Rfinger.num = numbers[i];
                Rfinger.line = valLine;
                answer += "R";
            } else {//2,5,8,0
                int left = Math.abs(Lfinger.line - valLine) + Lfinger.plusColumn();
                int right = Math.abs(Rfinger.line - valLine) + Rfinger.plusColumn();
                System.out.println("2580else구문 : " +numbers[i] + "에서 L/R값:" + left +"/" +right);
                //왼쪽이 더 가까운경우
                if (left < right) {
                    Lfinger.num = numbers[i];
                    Lfinger.line = valLine;
                    answer += "L";
                } else if (left > right){
                    Rfinger.num = numbers[i];
                    Rfinger.line = valLine;
                    answer += "R";
                } else {//같을경우 왼손잡이냐 오른손잡이냐
//                    System.out.println(left +"/" + right);
//                    System.out.println("같음!" + numbers[i]);
                    if (hand.equals("left")) {//왼손잡이
                        Lfinger.num = numbers[i];
                        Lfinger.line = valLine;
                        answer += "L";
                    } else {//오른손잡이
                        Rfinger.num = numbers[i];
                        Rfinger.line = valLine;
                        answer += "R";
                    }
                }
            }
        }

        return answer;
    }

    int findline(int finger) {
        if (finger <= 3 && finger >= 1) {
            return 0;
        } else if (finger >= 4 && finger <= 6) {
            return 1;
        } else if (finger >= 7 && finger <= 9) {
            return 2;
        } else if (finger == 0 || finger == 10 || finger == 11) {//10, 11== * #
            return 3;
        } else {
            return 0;
        }
    }


    class Finger {
        int num, line;

        Finger(int line, int num) {
            this.line = line;
            this.num = num;
        }

        int plusColumn() {
            if (num == 2 || num == 5 || num == 8 || num == 0) {
                return 0;
            } else return 1;
        }
    }
}

 

 

다른사람 코드 

class Solution {
    int tempL = 10;
    int tempR = 12;
    String myhand;
    public String solution(int[] numbers, String hand) {
        myhand = ((hand.equals("right"))? "R": "L");
        String answer = "";
        for(int i=0 ; i< numbers.length ; i++) {
            switch(numbers[i]) {
                case 1: case 4: case 7:
                    answer += "L";
                    tempL = numbers[i];
                    break;
                case 3: case 6: case 9:
                    answer += "R";
                    tempR = numbers[i];
                    break;
                default:
                    String tempHand = checkHand(numbers[i]);
                    if(tempHand.equals("R"))
                        tempR = numbers[i] + ((numbers[i] == 0)? 11:0);
                    else tempL = numbers[i] + ((numbers[i] == 0)? 11:0);
                    answer += tempHand;
                    break;
            }
        }
        return answer;
    }

    private String checkHand(int tempNum) {
        int leftDistance = 0;
        int rightDistance = 0;
        if(tempNum == 0) tempNum = 11;

        leftDistance = Math.abs((tempNum-1)/3 - (tempL-1)/3) + Math.abs((tempNum-1)%3 - (tempL-1)%3);
        rightDistance = Math.abs((tempNum-1)/3 - (tempR-1)/3) + Math.abs((tempNum-1)%3 - (tempR-1)%3);
        System.out.println(tempNum + ": " + leftDistance + ", " + rightDistance);
        return ((leftDistance == rightDistance)? myhand: (leftDistance > rightDistance)? "R": "L");

    }
}

 

수학적으로 코드를 짜보려고했는데, 잘 안됐었는데 위 코더는 그런식으로 구현하는데 성공한것 같다.

-1을 해서 3에 나누어떨어지는 방식으로 구현하는것이 아이디어의 핵심인것같다.

 

또한,

switch문을 통해서 for문처럼 길게하지 않고 구현하는게 깔끔하고 좋다..

switch문도 적극 활용하자.

반응형