알고리즘 풀이 방법입니다.
문제(Problem) -> 생각(Think) -> 해결책(Solution) -> 리뷰(Review) 를 통해서 정리해서 작성합니다.
Problem📄

https://school.programmers.co.kr/learn/courses/30/lessons/67256

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr


Think🤔

지문이 기므로 문제 파악을 정확히 해야된다!

package kcue.test;

public class pushKeypad {

	public static void main(String[] args) {
		int numbers[] = {1,3,4,5,8,2,1,4,5,9,5}; 	String hand = "right";	// result : "LRLLLRLLRRL"
		//int numbers[] = {7,0,8,2,8,3,1,5,7,6,2};	String hand = "left";	// result : "LRLLRRLLLRR"
		//int numbers[] = {1,2,3,4,5,6,7,8,9,0};	String hand = "right";	// result : "LLRLLRLLRL"
		
		String answer = "";
		int nowLeft  = 10; 
		int nowRight = 12; // 현재 위치
		
		for(int i=0; i<numbers.length; i++) {
			if(numbers[i] == 1 || numbers[i] == 4 || numbers[i] == 7) {
				answer += "L";
				continue;
			}else if(numbers[i] == 3 || numbers[i] == 6 || numbers[i] == 9){
				answer += "R";
				continue;
			}else {
				numbers[i] = (numbers[i] == 0 ) ? 11 : numbers[i];
				
				answer += calCulate(nowLeft,nowRight,numbers[i],hand);
			}
		}
		
		System.out.println(answer);
		
	}
	
	// 거리 계산
	public static String calCulate(int left , int right , int point , String hand) { // main에서 실행 하기 위해 static에 메소드 올려줌
		int leftD = 0,rightD = 0; // D : Distance(거리)
		if(point == left + 1 || point == left - 1) { // 좌우일 경우 거리 1
			leftD++;
		}else {
			leftD = (point / left) + ((point % left < 3) ? 1 : 0);
		}
		if(point == right + 1 || point == right - 1) {
			rightD++;
		}else {
			rightD = (point / right) + ((point % right < 3) ? 1 : 0);
		}
		
		
		if(leftD > rightD) {
			// nowLeft  = point;
			return "L";
		}else if(leftD < rightD) {
			// nowRight = point;
			return "R";
		}else
			// point 가 left면 nowLeft = point;
			// point 가 right면 nowRight = point;
		return String.valueOf(hand.charAt(0));
	}

}
package kcue.test;

public class pushKeypad2 {

	public static void main(String[] args) {
		int numbers[] = {1,3,4,5,8,2,1,4,5,9,5}; 	String hand = "right";	// result : "LRLLLRLLRRL"
		//int numbers[] = {7,0,8,2,8,3,1,5,7,6,2};	String hand = "left";	// result : "LRLLRRLLLRR"
		//int numbers[] = {1,2,3,4,5,6,7,8,9,0};	String hand = "right";	// result : "LLRLLRLLRL"
		
		String answer = "";
		int nowLeft  = 10; 
		int nowRight = 12; // 현재 위치
		// 4 5 8 
        for(int i=0; i<numbers.length; i++) {
        	System.out.println("numbers[i] : " + numbers[i]);
			if(numbers[i] == 1 || numbers[i] == 4 || numbers[i] == 7) {
				answer += "L";
				nowLeft = numbers[i];
				continue;
			}else if(numbers[i] == 3 || numbers[i] == 6 || numbers[i] == 9){
				answer += "R";
				nowRight = numbers[i];
				continue;
			}else {
				numbers[i] = (numbers[i] == 0 ) ? 11 : numbers[i];
				
				// 계산
                int leftD = 0,rightD = 0; // D : Distance(거리)
                if(numbers[i] == nowLeft + 1 || numbers[i] == nowLeft - 1) { // 좌우일 경우 거리 1
                    leftD++;
                }else if(numbers[i] == nowLeft + 3 || numbers[i] == nowLeft - 3) { // 위아래 경우 거리 1
                    leftD++;
                }else {
                    leftD = (numbers[i] / nowLeft) + ((numbers[i] % nowLeft < 3) ? 1 : 0);
                }
                
                if(numbers[i] == nowRight + 1 || numbers[i] == nowRight - 1) {
                    rightD++;
                }else if(numbers[i] == nowRight + 3 || numbers[i] == nowRight - 3) { // 위아래 경우 거리 1
                	rightD++;
                }else {
                    rightD = (numbers[i] / nowRight) + ((numbers[i] % nowRight < 3) ? 1 : 0);
                }
                
                if(leftD == 0) {
                	answer += "R";
                	continue;
                }else if(rightD == 0){
                	answer += "L";
                	continue;
                }else {
                	
                }

                if(leftD < rightD) {
                    nowLeft  = numbers[i];
                    answer += "L";
                }else if(leftD > rightD) {
                    nowRight = numbers[i];
                    answer += "R";
                }else{
                    if(hand.equals("left")){
                        nowLeft = numbers[i];
                    }else{
                        nowRight = numbers[i];
                    }
                    answer += String.valueOf(hand.charAt(0)).toUpperCase();
                }
			}
		}
		
		System.out.println(answer);
	}

}

규칙을 찾아서 일단 if else로 만들었으나... 잘못 푼 듯했는데!! 

다른 풀이 보니깐 정말 비슷한 코드가 있으므로 중간에 거리 계산해주는 부분을 리팩터링 할 필요가 있다!

 

거리 구하는 부분을 수정할 필요가 있음 

중복되는 코드가 있으므로 메서드를 생성


Solution✍

노트에 먼저 

1 2 3

4 5 6

7 8 9

* 0 #

을 노트에 그리고.. 문제에서 주어지는 배열은 다 숫자이기 때문에 키패드에서 문자를 누를 일이 없으므로 , 처음 값에 대입

숫자를 순서대로 대입하고 0이나오면 중간 값인 11로 변환시킨다!

package kcue.test;

public class pushKeypad2 {

	public static void main(String[] args) {
		int numbers[] = { 1, 3, 4, 5, 8, 2, 1, 4, 5, 9, 5 };
		String hand = "right"; // result : "LRLLLRLLRRL"
		// int numbers[] = {7,0,8,2,8,3,1,5,7,6,2}; String hand = "left"; // result : "LRLLRRLLLRR"
		// int numbers[] = {1,2,3,4,5,6,7,8,9,0};   String hand = "right";// result : "LLRLLRLLRL"

		String answer = "";
		int nowLeft = 10;
		int nowRight = 12; // 현재 위치
		int leftD = 0, rightD = 0;
		// 4 5 8
		for (int i = 0; i < numbers.length; i++) {
			System.out.println("numbers[i] : " + numbers[i]);
			if (numbers[i] == 1 || numbers[i] == 4 || numbers[i] == 7) {
				answer += "L";
				nowLeft = numbers[i];
				continue;
			} else if (numbers[i] == 3 || numbers[i] == 6 || numbers[i] == 9) {
				answer += "R";
				nowRight = numbers[i];
				continue;
			} else {
				numbers[i] = (numbers[i] == 0) ? 11 : numbers[i]; // 0의 위치면 11
				leftD = calCulate(nowLeft, numbers[i]);
				rightD = calCulate(nowRight, numbers[i]);

				if (leftD < rightD) {
					nowLeft = numbers[i];
					answer += "L";
				} else if (leftD > rightD) {
					nowRight = numbers[i];
					answer += "R";
				} else {
					if (hand.equals("left")) {
						nowLeft = numbers[i];
					} else {
						nowRight = numbers[i];
					}
					answer += String.valueOf(hand.charAt(0)).toUpperCase();
				}
			}
		}

		System.out.println(answer);
	}

	// 거리계산
	public static int calCulate(int nowPoint, int num) {
		int distance = 0;

		distance = (Math.abs(num - nowPoint) / 3) + (Math.abs(num - nowPoint) % 3);

		return distance;
	}

}

Review🤩

거리 계산에 머리 써야 됨!


 

+ Recent posts