키패드누르기

이준경·2021년 5월 3일
0

<나의풀이>

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
class Solution {
    public String solution(int[] numbers, String hand) {
        String answer = "";
        int left=4,right=4;
        hand = hand.toUpperCase();
        char hand1 = hand.charAt(0);
        int leftleng=1, rightleng=1;
 
        for(int i=0; i<numbers.length;i++){
            if(numbers[i]==0)
                numbers[i]=11;
 
            if(numbers[i]%3==1){
                answer+="L";
                left = (numbers[i]+2)/3;
                leftleng=1;
            }
 
            else if(numbers[i]%3==0){
                answer+="R";
                right = numbers[i]/3;
                rightleng=1;
            }
 
            else{
                int j =(numbers[i]+1)/3;
 
                if(Math.abs(j-right)+rightleng > Math.abs(j-left)+leftleng){
                    left=j;
                    answer+="L";
                    leftleng=0;
                }
                else if(Math.abs(j-right)+rightleng < Math.abs(j-left)+leftleng){
                    right=j;
                    answer+="R";
                    rightleng=0;
                }
                else{
                    if(hand1=='R'){
                        right=j;
                        answer+="R";
                        rightleng=0;
                    }
                    else{
                        left=j;
                        answer+="L";
                        leftleng=0;
                    }
 
                }
 
            }
 
        }
 
        return answer;
    }
}
cs

한칸씩 움직이므로 이를 표현하기 위해 총 12개의 문자를 윗열은 모두 1 다음열 2 다다음열3 마지막열 4로 만들어 풀음

  1. *,# 은 양 손의 시작점. 이를 각각 4로 선언.
  2. 손잡이 알기 위해 hand 대문자로 만들고 앞 한글자만 hand1으로 생성
  3. 왼손, 오른손 모두 가운데로 가려면 한번 움직여야함. 이를 표현해주기위한 leng생성
  4. 주어진 수가 0일 경우 11로 변환
  5. 나머지가 1이면 왼손으로 키패드 누름. 값에서 1을 더하고 3으로 나눈 값 left 대입(1234중 하나됨). leftleng은 1이됨.
  6. 나머지가 0이면 오른손으로 키패드 누름. 값을 3으로 나눈 값 right 대입(1234중 하나됨)
    rightleng은 1이됨.
  7. 6,7 번이 아닐 때는 주어진 수가 가운데 일 때 뿐임. 따라서 주어진 수에 +1 한 뒤 3으로 나눈 값을 j에 대입
  8. (j-right)절댓값+rightleng 과 (j-left)절댓값+leftleng 비교했을때 더 작은 쪽이 주어진 수와 가까우므로 작은 쪽손에 j 대입. answer에 작은쪽 손 추가대입. leng 길이는 현재 주어진 수가 가운데 열이므로 0 대입.
  9. 만약 비교 했을때 같을 경우 주어진 손잡이를 anwser대입하고 그손에 j대입. leng 0 대입
  10. 반복하여 answer 반환

<다른사람풀이>

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
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 1case 4case 7:
                    answer += "L";
                    tempL = numbers[i];
                    break;
                case 3case 6case 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");
 
    }
}
cs

0개의 댓글

관련 채용 정보