본문 바로가기
코딩테스트 연습

키패드에서 왼손엄지와 오른손엄지중 어느 것으로 누를지

by 고유빙글 2021. 8. 19.
public class keypad2 {

	public static void main(String[] args) {

		int[] numbers = {7, 0, 8, 2, 8, 3, 1, 5, 7, 6, 2};
		String hand = "left";

		String answer = solution(numbers, hand);
		System.out.println(answer);

	}

	private static String solution(int[] numbers, String hand) {
		
		int[] lp = {0,0};
		int[] rp = {2,0};
		int dl = 0;
		int dr = 0;
		int dl1 = 0;
		int dl2 = 0;
		int dr1 = 0;
		int dr2 = 0;
		String answer = "";
		if(hand.equals("right")) {
			hand="R";
		}else {
			hand="L";
		}
		
		for (int i = 0; i < numbers.length; i++) {
			System.out.println("=====");
			System.out.println(numbers[i]+" : "+answer);
			System.out.println("=====");
			
			if(numbers[i]==1) {
				lp[0]=0;
				lp[1]=3;
				answer = answer+"L";
			}else if(numbers[i]==4){
				lp[0]=0;
				lp[1]=2;
				answer = answer+"L";
			}else if(numbers[i]==7) {
				lp[0]=0;
				lp[1]=1;
				answer = answer+"L";
			}else if(numbers[i]==3) {
				rp[0]=2;
				rp[1]=3;
				answer = answer+"R";
			}else if(numbers[i]==6) {
				rp[0]=2;
				rp[1]=2;
				answer = answer+"R";
			}else if(numbers[i]==9) {
				rp[0]=2;
				rp[1]=1;
				answer = answer+"R";
			}
			//LRLLLRLLLRR
			//LRLLRRLLLRR
			//LRLLLRLLLRR
			
			if(numbers[i]==2) {
				//1,3
				dl1 = (1-lp[0]);
				dl2 = (3-lp[1]);
				dr1 = (1-rp[0]);
				dr2 = (3-rp[1]);
				dl = Math.abs(dl1)+Math.abs(dl2);
				dr = Math.abs(dr1)+Math.abs(dr2);
				
				if(dl>dr) {
					answer = answer+"R";
					rp[0]=1;
					rp[1]=3;
				}else if(dr>dl){
					answer = answer+"L";
					lp[0]=1;
					lp[1]=3;
				}else {
					answer = answer+hand;
					if(hand=="R") {
						rp[0]=1;
						rp[1]=3;
					}else {
						lp[0]=1;
						lp[1]=3;
					}
				}
			}else if(numbers[i]==5) {
				//1,2
				
				dl1 = (1-lp[0]);
				dl2 = (2-lp[1]);
				dr1 = (1-rp[0]);
				dr2 = (2-rp[1]);
				dl = Math.abs(dl1)+Math.abs(dl2);
				dr = Math.abs(dr1)+Math.abs(dr2);
				
				if(dl>dr) {
					answer = answer+"R";
					rp[0]=1;
					rp[1]=2;
				}else if(dr>dl){
					answer = answer+"L";
					lp[0]=1;
					lp[1]=2;
				}else {
					answer = answer+hand;
					if(hand=="R") {
						rp[0]=1;
						rp[1]=2;
					}else {
						lp[0]=1;
						lp[1]=2;
					}
				}
			}else if(numbers[i]==8) {
				//1,1

				dl1 = (1-lp[0]);
				dl2 = (1-lp[1]);
				dr1 = (1-rp[0]);
				dr2 = (1-rp[1]);
				dl = Math.abs(dl1)+Math.abs(dl2);
				dr = Math.abs(dr1)+Math.abs(dr2);
				
				if(dl>dr) {
					answer = answer+"R";
					rp[0]=1;
					rp[1]=1;
				}else if(dr>dl){
					answer = answer+"L";
					lp[0]=1;
					lp[1]=1;
				}else {
					answer = answer+hand;
					if(hand=="R") {
						rp[0]=1;
						rp[1]=1;
					}else {
						lp[0]=1;
						lp[1]=1;
					}
				}
			}else if(numbers[i]==0) {
				//1,0

				dl1 = (1-lp[0]);
				dl2 = (0-lp[1]);
				dr1 = (1-rp[0]);
				dr2 = (0-rp[1]);
				dl = Math.abs(dl1)+Math.abs(dl2);
				dr = Math.abs(dr1)+Math.abs(dr2);
				
				if(dl>dr) {
					answer = answer+"R";
					rp[0]=1;
					rp[1]=0;
				}else if(dr>dl){
					answer = answer+"L";
					lp[0]=1;
					lp[1]=0;
				}else {
					answer = answer+hand;
					if(hand=="R") {
						rp[0]=1;
						rp[1]=0;
					}else {
						lp[0]=1;
						lp[1]=0;
					}
				}
			}
			
			System.out.println("dl : "+dl);
			System.out.println("dr : "+dr);
			System.out.println("lp : "+"("+lp[0]+","+lp[1]+")");
			System.out.println("rp : "+"("+rp[0]+","+rp[1]+")");
			System.out.println("answer : "+answer);
			System.out.println("hand : "+hand);
		}
		return answer;
	}

}

많이 길지만..이게 정답으로 제출한 코드!

 

public class keypad {

	public static void main(String[] args) {

		int[] numbers = {1, 3, 4, 5, 8, 2, 1, 4, 5, 9, 5};
		String hand = "right";

		String answer = solution(numbers, hand);
		System.out.println(answer);

	}

	private static String solution(int[] numbers, String hand) {
		
		int[] lp = {0,0};
		int[] rp = {2,0};
		int dl = 0;
		int dr = 0;
		String answer = "";
//		hand = (hand=="right")? "R":"L";
		if(hand.equals("right")) {
			hand="R";
		}else {
			hand="L";
		}
		
		for (int i = 0; i < numbers.length; i++) {
			System.out.println("=====");
			System.out.println(numbers[i]+" : "+answer);
			System.out.println("=====");
			
			if(numbers[i]==1) {
				lp[0]=0;
				lp[1]=3;
				answer = answer+"L";
			}else if(numbers[i]==4){
				lp[0]=0;
				lp[1]=2;
				answer = answer+"L";
			}else if(numbers[i]==7) {
				lp[0]=0;
				lp[1]=1;
				answer = answer+"L";
			}else if(numbers[i]==3) {
				rp[0]=2;
				rp[1]=3;
				answer = answer+"R";
			}else if(numbers[i]==6) {
				rp[0]=2;
				rp[1]=2;
				answer = answer+"R";
			}else if(numbers[i]==9) {
				rp[0]=2;
				rp[1]=1;
				answer = answer+"R";
			}
			//LRLLLRLLLRL
			//LRLLLRLLRRL
			//LRLLLRLLRRL
			
			if(numbers[i]==2) {
				//1,3
				dl = (1-lp[0])*(1-lp[0]) + (3-lp[1])*(3-lp[1]);
				dr = (1-rp[0])*(1-rp[0]) + (3-rp[1])*(3-rp[1]);
				if(dl>dr) {
					answer = answer+"R";
					rp[0]=1;
					rp[1]=3;
				}else if(dr>dl){
					answer = answer+"L";
					lp[0]=1;
					lp[1]=3;
				}else {
					answer = answer+hand;
					if(hand=="R") {
						rp[0]=1;
						rp[1]=3;
					}else {
						lp[0]=1;
						lp[1]=3;
					}
				}
			}else if(numbers[i]==5) {
				//1,2
				dl = (1-lp[0])*(1-lp[0]) + (2-lp[1])*(2-lp[1]);
				dr = (1-rp[0])*(1-rp[0]) + (2-rp[1])*(2-rp[1]);
				if(dl>dr) {
					answer = answer+"R";
					rp[0]=1;
					rp[1]=2;
				}else if(dr>dl){
					answer = answer+"L";
					lp[0]=1;
					lp[1]=2;
				}else {
					answer = answer+hand;
					if(hand=="R") {
						rp[0]=1;
						rp[1]=2;
					}else {
						lp[0]=1;
						lp[1]=2;
					}
				}
			}else if(numbers[i]==8) {
				//1,1
				dl = (1-lp[0])*(1-lp[0]) + (1-lp[1])*(1-lp[1]);
				dr = (1-rp[0])*(1-rp[0]) + (1-rp[1])*(1-rp[1]);
				if(dl>dr) {
					answer = answer+"R";
					rp[0]=1;
					rp[1]=1;
				}else if(dr>dl){
					answer = answer+"L";
					lp[0]=1;
					lp[1]=1;
				}else {
					answer = answer+hand;
					if(hand=="R") {
						rp[0]=1;
						rp[1]=1;
					}else {
						lp[0]=1;
						lp[1]=1;
					}
				}
			}else if(numbers[i]==0) {
				//1,0
				dl = (1-lp[0])*(1-lp[0]) + (0-lp[1])*(0-lp[1]);
				dr = (1-rp[0])*(1-rp[0]) + (0-rp[1])*(0-rp[1]);
				if(dl>dr) {
					answer = answer+"R";
					rp[0]=1;
					rp[1]=0;
				}else if(dr>dl){
					answer = answer+"L";
					lp[0]=1;
					lp[1]=0;
				}else {
					answer = answer+hand;
					if(hand=="R") {
						rp[0]=1;
						rp[1]=0;
					}else {
						lp[0]=1;
						lp[1]=0;
					}
				}
			}
			
			System.out.println("dl : "+dl);
			System.out.println("dr : "+dr);
			System.out.println("lp : "+"("+lp[0]+","+lp[1]+")");
			System.out.println("rp : "+"("+rp[0]+","+rp[1]+")");
			System.out.println("answer : "+answer);
		}
		return answer;
	}

}

이건 먼저 작성했던 코드!!

 

문제에서 키패드에서 이동방법이 대각선은 없기에 더 가까운 손가락을 찾을때 방법이 달라 두가지로 풀게됐다.

 

다른사람의 풀이를 보니 Math.abs()에서 괄호안에서 연산을 하는 것과

A = ( B.equals(C) ) ? D : E;

에서 내부에 연산자를 사용할 수 있는 것등을 참고할 수 있었고

 

메소드를 더 세분화해서 만드는 감을 접해볼 수 있었다.