ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [카카오 인턴] 키패드 누르기
    코딩 테스트/Level 1 2020. 9. 8. 07:07
    반응형

    키패드 누르기
    2020 카카오 인턴십 
    1974명 완료

    https://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

    def solution(numbers, hand):
        answer = []
        positions = {1: (0, 3), 4: (0, 2), 7: (0, 1), 2: (1, 3), 5: (1, 2), 8: (1, 1), 0: (1, 0), 3: (2, 3), 6: (2, 2), 9: (2, 1)}
        left = (0, 0)
        right = (2, 0)
        for number in numbers:
            if number in (1, 4, 7):
                answer.append('L')
                left = positions[number]
            elif number in (3, 6, 9):
                answer.append('R')
                right = positions[number]
            else:
                left_dist = abs(positions[number][0] - left[0]) + abs(positions[number][1] - left[1])
                right_dist = abs(positions[number][0] - right[0]) + abs(positions[number][1] - right[1])
                if left_dist < right_dist or (left_dist == right_dist and hand == 'left'):
                    answer.append('L')
                    left = positions[number]
                else:
                    answer.append('R')
                    right = positions[number]
        return ''.join(answer)
    테스트 1 〉	통과 (0.00ms, 9.54MB)
    테스트 2 〉	통과 (0.01ms, 9.44MB)
    테스트 3 〉	통과 (0.01ms, 9.58MB)
    테스트 4 〉	통과 (0.00ms, 9.66MB)
    테스트 5 〉	통과 (0.01ms, 9.55MB)
    테스트 6 〉	통과 (0.01ms, 9.39MB)
    테스트 7 〉	통과 (0.01ms, 9.52MB)
    테스트 8 〉	통과 (0.02ms, 9.49MB)
    테스트 9 〉	통과 (0.02ms, 9.68MB)
    테스트 10 〉	통과 (0.02ms, 9.53MB)
    테스트 11 〉	통과 (0.04ms, 9.55MB)
    테스트 12 〉	통과 (0.03ms, 9.55MB)
    테스트 13 〉	통과 (0.06ms, 9.56MB)
    테스트 14 〉	통과 (0.13ms, 9.55MB)
    테스트 15 〉	통과 (0.34ms, 9.45MB)
    테스트 16 〉	통과 (0.31ms, 9.6MB)
    테스트 17 〉	통과 (0.77ms, 9.68MB)
    테스트 18 〉	통과 (0.58ms, 9.73MB)
    테스트 19 〉	통과 (0.69ms, 9.5MB)
    테스트 20 〉	통과 (0.64ms, 9.65MB)

    가독성 좋은 이런 식의 코드를 더 좋아하지만.. 

    def solution(numbers, hand):
        answer = []
        positions = {1: (0, 3), 4: (0, 2), 7: (0, 1), 2: (1, 3), 5: (1, 2), 8: (1, 1), 0: (1, 0), 3: (2, 3), 6: (2, 2), 9: (2, 1)}
        left = (0, 0)
        right = (2, 0)
        for number in numbers:
            if number in (1, 4, 7):
                answer.append('L')
                left = positions[number]
            elif number in (3, 6, 9):
                answer.append('R')
                right = positions[number]
            else:
                left_dist = calc_dist(positions[number], left)
                right_dist = calc_dist(positions[number], right)
                if left_dist < right_dist or (left_dist == right_dist and hand == 'left'):
                    answer.append('L')
                    left = positions[number]
                else:
                    answer.append('R')
                    right = positions[number]
        return ''.join(answer)
    
    
    def calc_dist(a, b):
        return abs(a[0] - b[0]) + abs(a[1] - b[1])

     

    golang

    func solution(numbers []int, hand string) string {
    	temp := make([]rune, len(numbers))
    	positions := map[int][]int{
    		1: []int{0, 3}, 4: []int{0, 2}, 7: []int{0, 1},
    		2: []int{1, 3}, 5: []int{1, 2}, 8: []int{1, 1},
    		3: []int{2, 3}, 6: []int{2, 2}, 9: []int{2, 1},
    		0: []int{1, 0},
    	}
    	left, right := []int{0, 0}, []int{2, 0}
    	for i, v := range numbers {
    		if v == 1 || v == 4 || v == 7 {
    			temp[i] = 'L'
    			left = positions[v]
    		} else if v == 3 || v == 6 || v == 9 {
    			temp[i] = 'R'
    			right = positions[v]
    		} else {
    			left_dist := calc_dist(positions[v], left)
    			right_dist := calc_dist(positions[v], right)
    			if left_dist < right_dist || (left_dist == right_dist && hand == "left") {
    				temp[i] = 'L'
    				left = positions[v]
    			} else {
    				temp[i] = 'R'
    				right = positions[v]
    			}
    		}
    	}
    	return string(temp)
    }
    
    func calc_dist(a, b []int) int {
    	x := a[0] - b[0]
    	y := a[1] - b[1]
    	if x < 0 {
    		x = -x
    	}
    	if y < 0 {
    		y = -y
    	}
    	return x + y
    }

     

    Java

    class Solution {
        public String solution(int[] numbers, String hand) {
            StringBuilder answer = new StringBuilder();
            var lastLeft = new int[]{0, 0};
            var lastRight = new int[]{2, 0};
            var table = new int[][]{{1, 0}, {0, 3}, {1, 3}, {2, 3}, {0, 2}, {1, 2}, {2, 2}, {0, 1}, {1, 1}, {2, 1}};
            for (var each : numbers) {
                if (each == 1 || each == 4 || each == 7) {
                    answer.append('L');
                    lastLeft = table[each];
                } else if (each == 3 || each == 6 || each == 9) {
                    answer.append('R');
                    lastRight = table[each];
                } else {
                    var leftDistance = Math.abs(lastLeft[0] - table[each][0]) + Math.abs(lastLeft[1] - table[each][1]);
                    var rightDistance = Math.abs(lastRight[0] - table[each][0]) + Math.abs(lastRight[1] - table[each][1]);
                    if (leftDistance > rightDistance) {
                        answer.append('R');
                        lastRight = table[each];
                    } else if (leftDistance < rightDistance) {
                        answer.append('L');
                        lastLeft = table[each];
                    } else {
                        if (hand.equals("right")) {
                            answer.append('R');
                            lastRight = table[each];
                        } else {
                            answer.append('L');
                            lastLeft = table[each];
                        }
                    }
                }
            }
            return answer.toString();
        }
    }
    반응형
Designed by Tistory.