[프로그래머스] 키패드 누르기 JAVA 풀이

권용환·2021년 8월 20일
0

programmers_level1

목록 보기
4/14
post-thumbnail

문제 바로가기

나의 풀이

해당 숫자를 인덱스로 갖는 좌표로 2차원 배열을 구성하였다.
2차원 배열

그리고 numbers 배열에서 (x,y) 형식을 갖춘 원소를 하나씩 꺼내면서 x가 0이면 1,4,7 일 것이고 x가 2이면 3,6,9 이며, x가 1이면 2,5,8,0 중의 하나가 될 것이라 생각했다.

특히, x가 1 일때의 거리는 유클리드 거리가 아닌 맨해튼 거리를 구하여서 비교하였다.

나는 if문의 분절을 number에 해당하는 좌표의 x값을 기준으로 삼았는데, 다른 사람들의 풀이를 보니 number 자체 값으로 switch case를 통해 나누기도 한 듯하다.

다만 내 생각에는 내 방식이 좀 더 낫다고 생각한다. 어차피 number들을 좌표로 바꿔야한다면 굳이 따로 생각해서 코드 길이가 늘어나게 되지 않을까.

내 풀이에서 아쉬운 점은

answer += "R";				answer += "L";
right = point;				left = point;
  • 이런 반복된 코드들이 많다는 것이고 코테가 아니었다면 반드시 메서드를 추출했어야 했을 것이다.
  • getManhattanDistance와 같은 메서드도 정의해서 다른 사람이 봤을때 한눈에 알아볼 수 있는 코드를 쓰는게 나을 것이다.

class Solution {
    public String solution(int[] numbers, String hand) {
        int[][] phone = {{1,3},{0,0},{1,0},{2,0},{0,1},{1,1},{2,1},{0,2},{1,2},{2,2}};
        int[] left = {0, 3};
        int[] right = {2, 3};
        String answer = "";

        for (int number : numbers) {
            int[] point = phone[number];
            if (point[0] == 0) {
                answer += "L";
                left = point;
            } else if (point[0] == 2) {
                answer += "R";
                right = point;
            } else {
                int leftDist = Math.abs(left[0] - point[0]) + Math.abs(left[1] - point[1]);
                int rightDist = Math.abs(right[0] - point[0]) + Math.abs(right[1] - point[1]);

                if (leftDist < rightDist) {
                    answer += "L";
                    left = point;
                } else if (leftDist > rightDist || hand.equals("right")) {
                    answer += "R";
                    right = point;
                } else {
                    answer += "L";
                    left = point;
                }
            }
        }
        return answer;
    }
}
profile
마구 낙서하는 블로그입니다

0개의 댓글