알고리즘 공부/프로그래머스

프로그래머스 코딩테스트 연습 - 2020 카카오 인턴십 - 키패드 누르기

HRuler 2020. 10. 6. 23:48

1. 문제

https://programmers.co.kr/learn/courses/30/lessons/67256?language=java

 

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

[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

2. 나의 풀이

class Solution {
    public String solution(int[] numbers, String hand) {
        String answer = "";
		int L_location = -1;
		int R_location = -1;
		for(int i = 0; i < numbers.length; i = i + 1) {
			if(numbers[i] % 3 == 1) {
				answer += "L";
				L_location = numbers[i];
				
			}else if(numbers[i] != 0 && numbers[i] % 3 == 0) {
				answer += "R";
				R_location = numbers[i];
			}else{
				if(distance(numbers[i], L_location) < distance(numbers[i], R_location)) {
					answer += "L";
					L_location = numbers[i];
				}else if(distance(numbers[i], R_location) < distance(numbers[i], L_location)) {
					answer += "R";
					R_location = numbers[i];
				}else if(distance(numbers[i], R_location) == distance(numbers[i], L_location)) {
					if(hand.equals("right")) {
						answer += "R";
						R_location = numbers[i];
					}else if(hand.equals("left")) {
						answer += "L";
						L_location = numbers[i];
					}
				}
			}
		}
		
		return answer;
    }
    int distance(int numbers, int location) {
		int distance = 0;
		if(numbers == 2) {
			switch(location) {
				case -1 : distance = 4;break;
				case 1 : distance = 1;break;
				case 2 : distance = 0;break;
				case 3 : distance = 1;break;
				case 4 : distance = 2;break;
				case 5 : distance = 1;break;
				case 6 : distance = 2;break;
				case 7 : distance = 3;break;
				case 8 : distance = 2;break;
				case 9 : distance = 3;break;
				case 0 : distance = 3;break;
			}
		}else if(numbers == 5) {
			switch(location) {
				case -1 : distance = 3;break;
				case 1 : distance = 2;break;
				case 2 : distance = 1;break;
				case 3 : distance = 2;break;
				case 4 : distance = 1;break;
				case 5 : distance = 0;break;
				case 6 : distance = 1;break;
				case 7 : distance = 2;break;
				case 8 : distance = 1;break;
				case 9 : distance = 2;break;
				case 0 : distance = 2;break;
			}
		}else if(numbers == 8) {
			switch(location) {
				case -1 : distance = 2;break;
				case 1 : distance = 3;break;
				case 2 : distance = 2;break;
				case 3 : distance = 3;break;
				case 4 : distance = 2;break;
				case 5 : distance = 1;break;
				case 6 : distance = 2;break;
				case 7 : distance = 1;break;
				case 8 : distance = 0;break;
				case 9 : distance = 1;break;
				case 0 : distance = 1;break;
			}
		}else if(numbers == 0) {
			switch(location) {
			case -1 : distance = 1;break;
			case 1 : distance = 4;break;
			case 2 : distance = 3;break;
			case 3 : distance = 4;break;
			case 4 : distance = 3;break;
			case 5 : distance = 2;break;
			case 6 : distance = 3;break;
			case 7 : distance = 2;break;
			case 8 : distance = 1;break;
			case 9 : distance = 2;break;
			case 0 : distance = 0;break;
		}
	}
		return distance;
	}
}

3. 다른 사람 풀이

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

    }
}