[프로그래머스] LV1. 키패드 누르기

journey📸·2021년 9월 15일
0

코딩테스트 - JAVA

목록 보기
1/7
post-thumbnail

💻 문제

🔎 나의 해결 방식

사실 처음부터 혼자 알고리즘을 생각해내지는 못했다. 그래서 다른 사람들의 코드를 보고 풀이 방식을 이해했다.
대체 중간에 2, 5, 8, 0을 누를 때 어떤 방식으로 최단거리를 구해야하는지 이해가 안됐는데, 다른 코드를 보고나니 충분히 생각해낼 수 있었던 문제였다.

📝 풀이 순서

1, 4, 7 / 3, 6, 9인 경우는 간단하기 때문에 목표 지점이 2, 5, 8, 0일 때만 고민하면 됐다.


📍
일단 시작지점이 왼손은 *, 오른손은 #이라서 각각 10, 12라고 지정했고, 0은 11이라고 했다.

    if(n==0) n += 11;

📍
목표 지점이 2, 5, 8, 0일 때 현재 위치와 목표 숫자까지의 거리를 구해야 한다.
목표 숫자에서 현재 손가락이 위치한 숫자를 뺀 값에 3을 나눈 몫이 가로길이, 3으로 나눈 나머지 값이 세로길이이다.

	leftLth = Math.abs(n-left)/3 + Math.abs(n-left)%3;
	rightLth = Math.abs(n-right)/3 + Math.abs(n-right)%3;

💡 전체 코드


class Soultion{

    public String solution(int[] numbers, String hand) {

        StringBuilder sb = new StringBuilder();
        int left = 10, right = 12;
        int leftLth, rightLth;
        for(int n : numbers){
            if (n == 1 || n == 4 || n == 7){
                sb.append("L");
                left = n;
            }
            else if (n == 3 || n == 6 || n == 9){
                sb.append("R");
                right = n;
            }
            else if ( n == 2 || n == 5 || n == 8 || n == 0){
                if(n==0) n += 11;
                leftLth = Math.abs(n-left)/3 + Math.abs(n-left)%3;
                rightLth = Math.abs(n-right)/3 + Math.abs(n-right)%3;

                if(leftLth == rightLth){
                    if(hand.equals("left")) {
                        sb.append("L");
                        left = n;
                    }
                    else {
                        sb.append("R");
                        right = n;
                    }
                }
                else if (leftLth < rightLth){
                    sb.append("L");
                    left = n;
                }
                else{
                    sb.append("R");
                    right = n;
                }
            }
        }

        return sb.toString();
    }


}
profile
https://iwntberich.tistory.com/

0개의 댓글