잡다한 배똥월드

728x90
코딩 테스트 풀이 체크리스트
2시간 내에 풀었는가? O
본인의 실력으로 풀었는가? X

 

 

코딩테스트 연습 - 키패드 누르기

[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

 

 

 

 

 

class Solution {
    public String solution(int[] numbers, String hand) {
        StringBuilder answer = new StringBuilder();
        String[] keypad = {"l", "m", "r", "l", "m", "r", "l", "m", "r", "l", "m", "r"};
        
        int left = 9;
        int right = 11;
        
        for (int i = 0; i < numbers.length; i++) {
            if (numbers[i] == 0) {
                numbers[i] = 10;
            } else {
                numbers[i]--;
            }
        }
                           
        for (int i = 0; i < numbers.length; i++) {
            int num = numbers[i];
            if (keypad[num].equals("l")) {
                left = num;
                answer.append("L");
            } else if (keypad[num].equals("r")) {
                right = num;
                answer.append("R");
            } else {
                int temp = func(num, left, right);
                if (temp == 1) {
                    left = num;
                    answer.append("L");
                } else if (temp == -1) {
                    right = num;
                    answer.append("R");
                } else {
                    if (hand.equals("left")) {
                        left = num;
                        answer.append("L");
                    } else {
                        right = num;
                        answer.append("R");
                    }
                }
            }
        }
        
        return answer.toString();
    }
    
    public int func(int number, int left, int right) {
        int num = number;
        
        int l1 = (left) / 3;
        int m1 = (num) / 3;
        int r1 = (right) / 3;
        
        int l2 = (left) % 3;
        int m2 = (num) % 3;
        int r2 = (right) % 3;
        
        double lFar = Math.abs(l1 - m1) + Math.abs(l2 - m2);
        double rFar = Math.abs(r1 - m1) + Math.abs(r2 - m2);
        
        if (lFar < rFar) {
            return 1;
        } else if (lFar > rFar) {
            return -1;
        } else {
            return 0;
        }
    }
}

 

테스트 1 통과 (0.04ms, 76.1MB)
테스트 2 통과 (0.04ms, 73.5MB)
테스트 3 통과 (0.04ms, 77.1MB)
테스트 4 통과 (0.03ms, 72.4MB)
테스트 5 통과 (0.05ms, 73MB)
테스트 6 통과 (0.06ms, 77.1MB)
테스트 7 통과 (0.06ms, 67.6MB)
테스트 8 통과 (0.08ms, 76.1MB)
테스트 9 통과 (0.07ms, 80.2MB)
테스트 10 통과 (0.05ms, 71.8MB)
테스트 11 통과 (0.05ms, 72.4MB)
테스트 12 통과 (0.08ms, 68.8MB)
테스트 13 통과 (0.09ms, 64.8MB)
테스트 14 통과 (0.16ms, 84.4MB)
테스트 15 통과 (0.32ms, 75.3MB)
테스트 16 통과 (0.27ms, 76.2MB)
테스트 17 통과 (0.58ms, 73.8MB)
테스트 18 통과 (0.28ms, 78.9MB)
테스트 19 통과 (0.50ms, 87.1MB)
테스트 20 통과 (0.50ms, 72.5MB)

 

 

 

 

 

도움을 받은 부분은 키패드의 거리 구할 때 유클리드 거리로 구했는데, 맨하탄 거리로 구해야 한다는 것을 알게 되었다..

 

 

 

 

 

좌표를 만들기 위해서 키패드 숫자에서 1씩 빼고, *은 9, 0은 10, #은 11로 만들어서 아래와 같은 표로 표현할 수 있다.

 

0
(실제 1)
1
(실제 2)
2
(실제 3)
3
(실제 4)
4
(실제 5)
5
(실제 6)
6
(실제 7)
7
(실제 8)
8
(실제 9)
9
(실제 *)
10
(실제 0)
11
(실제 #)

 

 

 

 

 

그래서 각각의 위치에 좌표를 구한다면 아래의 표와 같이 표현할 수 있는데,

x 좌표는 해당 위치의 숫자를 3으로 나눈 몫이고, y 좌표는 해당 위치의 숫자를 3으로 나눈 나머지이다.

 

0, 0 0, 1 0, 2
1, 0 1, 1 1, 2
2, 0 2, 1 2, 2
3, 0 3, 1 3, 2

 

 

 

 

 

그래서 좌표 (x1, y1), (x2, y2)의 맨하탄 거리를 구한다면 |x1 - x2| + |y1 - y2|이다.

처음엔 유클리드 거리로 해서 (x1-x2)^2 + (y1-y2)^2 로 했는데,

이렇게 하니까 테스트 13부터는 계속 오답이라고 떴다.

 

 

 

 

더보기

이전에 작성했던 코드

다른 풀이 참고해서 풀었던 기억이 있다

 

import java.util.*;

class Solution {
    public String solution(int[] numbers, String hand) {
        boolean value = true;
        int l = 10;
        int r = 12;
        
        if (hand.equals("right")){
            value = false;
        }
        
        ArrayList<String> data = new ArrayList<>();
        
        for (int i = 0; i < numbers.length; i++){
            int a = numbers[i];
            
            if (a == 0) a = 11;
            
            boolean value2 = true;
            
            if (a == 1 || a == 4 || a == 7){
                value2 = true;
            } else if (a == 3 || a == 6 || a == 9){
                value2 = false;
            } else {
                int ll = 0;
                int rr = 0;
                int l2 = l;
                int r2 = r;
                
                while (l2 != a){
                    if (l2 - a == -1 || l2 - a == 1){
                        ll++;
                        break;
                    }
                    
                    if (l2 > a){
                        l2 -= 3;
                        ll++;
                    } else {
                        l2 += 3;
                        ll++;
                    }
                }
                
                while (r2 != a){
                    if (r2 - a == -1 || r2 - a == 1){
                        rr++;
                        break;
                    }
                    
                    if (r2 > a){
                        r2 -= 3;
                        rr++;
                    } else {
                        r2 += 3;
                        rr++;
                    } 
                }
                
                if (ll > rr) {
                    value2 = false;
                } else if (ll < rr){
                    value2 = true;
                } else {
                    value2 = value;
                }
            }
            
            if (value2){
                data.add("L");
                l = a;
            } else {
                data.add("R");
                r = a;
            }
            
        }
        
        return String.join("", data);
    }
}

 

테스트 1 통과 (0.09ms, 52.1MB)
테스트 2 통과 (0.08ms, 51.8MB)
테스트 3 통과 (0.07ms, 52.4MB)
테스트 4 통과 (0.08ms, 53.2MB)
테스트 5 통과 (0.09ms, 51.8MB)
테스트 6 통과 (0.09ms, 53.1MB)
테스트 7 통과 (0.12ms, 52.8MB)
테스트 8 통과 (0.14ms, 53.9MB)
테스트 9 통과 (0.16ms, 53.6MB)
테스트 10 통과 (0.17ms, 52MB)
테스트 11 통과 (0.25ms, 52.1MB)
테스트 12 통과 (0.20ms, 53.1MB)
테스트 13 통과 (0.32ms, 52.2MB)
테스트 14 통과 (1.35ms, 51.7MB)
테스트 15 통과 (1.22ms, 52.6MB)
테스트 16 통과 (1.32ms, 53.4MB)
테스트 17 통과 (2.36ms, 52.5MB)
테스트 18 통과 (2.41ms, 52.4MB)
테스트 19 통과 (2.58ms, 52.6MB)
테스트 20 통과 (2.56ms, 52.1MB)

 

String으로 L, R을 더해서 시간은 조금 더 걸리는 듯하다.

 

 

 

 

 

728x90

+ Recent posts