DEV/알고리즘

[프로그래머스 Lv.1] 키패드 누르기 java

Imvory 2020. 11. 19. 13:42

문제설명

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

제한사항

  • numbers 배열의 크기는 1 이상 1,000 이하입니다.
  • numbers 배열 원소의 값은 0 이상 9 이하인 정수입니다.
  • hand는 "left" 또는 "right" 입니다.
    • "left"는 왼손잡이, "right"는 오른손잡이를 의미합니다.
  • 왼손 엄지손가락을 사용한 경우는 L, 오른손 엄지손가락을 사용한 경우는 R을 순서대로 이어붙여 문자열 형태로 return 해주세요.

 

입출력 예

numbers hand result
[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"

 

Solution

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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
class Solution {
    public String solution(int[] numbers, String hand) {
        String answer = "";
        int left = 10//*
        int right = 12//#
 
        for(int n : numbers) {
            if(n == 1 || n == 4 || n == 7) {
                answer += "L";
                left = n;
            }else if (n == 3 || n == 6 || n == 9) {
                answer += "R";
                right = n;
            }else if (n == 2 || n == 5 || n == 8 || n == 0) {
                
                if (distance(left,n)<distance(right,n)) {
                    answer += "L";
                    left = n;
                }else if (distance(left,n)>distance(right,n)) {
                    answer += "R";
                    right = n;
                }else {
                    
                    if(hand.equals("left")) {
                        answer += "L";
                        left = n;
                    }else if(hand.equals("right")) {
                        answer += "R";
                        right = n;
                    }
                }
                
            }
        }
        return answer;
    }
    
    public static int distance(int handLocation, int n) {
        /*
         
         * = 10
         0 = 11
         # = 12
         
         */
        if(handLocation==0) {
            handLocation = 11;
        }
        
        if(n==0) {
            n = 11;
        }
        
        int distance = 0;
        int num = Math.abs(n - handLocation);
        
        if(num%3==0) {
            distance = num/3;
        }else {
            distance = (num+1)/3 + 1;
        }
        
        return distance;
        
    }
}
cs

 

처음엔 키패드 2,5,8,0을 누를때 if 조건에 Math.abs(location-n)을 비교하기만 하면 된다고 생각했는데

그럼 오른손이 2에 있을때 5를 누르는 거리가 한칸으로 계산이 안된다 ㅠ

 

그래서 distance 메소드를 따로 만들어서 Math.abs(location-n)을 3으로 나누어주어 해결! :)