코딩테스트/Java

(2019 카카오) 키패드 누르기 Java

SK_MOUSE 2020. 12. 23. 15:58

 

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

 

필자가 작성한 코드는 손가락을 객체로 만들어서 Left, Right 손가락의 위치를 업데이트하는 방식으로 만들었다.

class Finger { ​​​​​​​​int num, line; ​​​​​​​​Finger(int line, int num) { ​​​​​​​​​​​​this.line = line; ​​​​​​​​​​​​this.num = num; ​​​​​​​​} ​​​​​​​​int plusColumn() { ​​​​​​​​​​​​if (num == 2 || num == 5 || num == 8 || num == 0) { ​​​​​​​​​​​​​​​​return 0; ​​​​​​​​​​​​} else return 1; ​​​​​​​​} ​​​​}

finger의 현재 행은 line이고, 구체적인 실제 숫자는 num에 들어간다.

해당 객체의 plusColumn은 손가락의 위치가 가운데열에있으면 0을 리턴, 아니면 1을 리턴해서 가로방향 움직임을 뜻한다.

 

 

잠깐 고민한 점 : 행 위치를 return하는 메소드.

int findline(int finger) { ​​​​​​​​if (finger <= 3 && finger >= 1) { ​​​​​​​​​​​​return 0; ​​​​​​​​} else if (finger >= 4 && finger <= 6) { ​​​​​​​​​​​​return 1; ​​​​​​​​} else if (finger >= 7 && finger <= 9) { ​​​​​​​​​​​​return 2; ​​​​​​​​} else if (finger == 0 || finger == 10 || finger == 11) {//10, 11== * # ​​​​​​​​​​​​return 3; ​​​​​​​​} else { ​​​​​​​​​​​​return 0; ​​​​​​​​} ​​​​}

*,#을 어떻게 처리해서 처음 위치를 어떻게 잡느냐였는데, 임의로 10,11이라는 숫자를 부여해서 해당값일때는 0이랑 같은 행으로 처리했다.

 

 

 

if문은 크게 세가지로 나눈다.

1. 왼쪽열, 즉 왼손만 누를수 있는 부분

2. 오른쪽열, 즉 오른손만 누를수 있는 부분

3. 가운데열, 양손중 비교해야되는 부분 => 세부적인 if문으로 들어간다.

 

 

전체코드

class Solution { ​​​​public String solution(int[] numbers, String hand) { ​​​​​​​​String answer = ""; ​​​​​​​​Finger Lfinger = new Finger(3, 10); ​​​​​​​​Finger Rfinger = new Finger(3, 11); ​​​​​​​​for (int i = 0; i < numbers.length; i++) { ​​​​​​​​​​​​int valLine = findline(numbers[i]); ​​​​​​​​​​​​//2580일때 ​​​​​​​​​​​​if (numbers[i] == 1 || numbers[i] == 4 || numbers[i] == 7) {//왼쪽라인or오른쪽라인인경우 ​​​​​​​​​​​​​​​​Lfinger.num = numbers[i]; ​​​​​​​​​​​​​​​​Lfinger.line = valLine; ​​​​​​​​​​​​​​​​answer += "L"; ​​​​​​​​​​​​} else if (numbers[i] == 3 || numbers[i] == 6 || numbers[i] == 9) {//왼쪽라인or오른쪽라인인경우 ​​​​​​​​​​​​​​​​Rfinger.num = numbers[i]; ​​​​​​​​​​​​​​​​Rfinger.line = valLine; ​​​​​​​​​​​​​​​​answer += "R"; ​​​​​​​​​​​​} else {//2,5,8,0 ​​​​​​​​​​​​​​​​int left = Math.abs(Lfinger.line - valLine) + Lfinger.plusColumn(); ​​​​​​​​​​​​​​​​int right = Math.abs(Rfinger.line - valLine) + Rfinger.plusColumn(); ​​​​​​​​​​​​​​​​System.out.println("2580else구문 : " +numbers[i] + "에서 L/R값:" + left +"/" +right); ​​​​​​​​​​​​​​​​//왼쪽이 더 가까운경우 ​​​​​​​​​​​​​​​​if (left < right) { ​​​​​​​​​​​​​​​​​​​​Lfinger.num = numbers[i]; ​​​​​​​​​​​​​​​​​​​​Lfinger.line = valLine; ​​​​​​​​​​​​​​​​​​​​answer += "L"; ​​​​​​​​​​​​​​​​} else if (left > right){ ​​​​​​​​​​​​​​​​​​​​Rfinger.num = numbers[i]; ​​​​​​​​​​​​​​​​​​​​Rfinger.line = valLine; ​​​​​​​​​​​​​​​​​​​​answer += "R"; ​​​​​​​​​​​​​​​​} else {//같을경우 왼손잡이냐 오른손잡이냐 // System.out.println(left +"/" + right); // System.out.println("같음!" + numbers[i]); ​​​​​​​​​​​​​​​​​​​​if (hand.equals("left")) {//왼손잡이 ​​​​​​​​​​​​​​​​​​​​​​​​Lfinger.num = numbers[i]; ​​​​​​​​​​​​​​​​​​​​​​​​Lfinger.line = valLine; ​​​​​​​​​​​​​​​​​​​​​​​​answer += "L"; ​​​​​​​​​​​​​​​​​​​​} else {//오른손잡이 ​​​​​​​​​​​​​​​​​​​​​​​​Rfinger.num = numbers[i]; ​​​​​​​​​​​​​​​​​​​​​​​​Rfinger.line = valLine; ​​​​​​​​​​​​​​​​​​​​​​​​answer += "R"; ​​​​​​​​​​​​​​​​​​​​} ​​​​​​​​​​​​​​​​} ​​​​​​​​​​​​} ​​​​​​​​} ​​​​​​​​return answer; ​​​​} ​​​​int findline(int finger) { ​​​​​​​​if (finger <= 3 && finger >= 1) { ​​​​​​​​​​​​return 0; ​​​​​​​​} else if (finger >= 4 && finger <= 6) { ​​​​​​​​​​​​return 1; ​​​​​​​​} else if (finger >= 7 && finger <= 9) { ​​​​​​​​​​​​return 2; ​​​​​​​​} else if (finger == 0 || finger == 10 || finger == 11) {//10, 11== * # ​​​​​​​​​​​​return 3; ​​​​​​​​} else { ​​​​​​​​​​​​return 0; ​​​​​​​​} ​​​​} ​​​​class Finger { ​​​​​​​​int num, line; ​​​​​​​​Finger(int line, int num) { ​​​​​​​​​​​​this.line = line; ​​​​​​​​​​​​this.num = num; ​​​​​​​​} ​​​​​​​​int plusColumn() { ​​​​​​​​​​​​if (num == 2 || num == 5 || num == 8 || num == 0) { ​​​​​​​​​​​​​​​​return 0; ​​​​​​​​​​​​} else return 1; ​​​​​​​​} ​​​​} }

 

 

다른사람 코드 

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"); ​​​​} }

 

수학적으로 코드를 짜보려고했는데, 잘 안됐었는데 위 코더는 그런식으로 구현하는데 성공한것 같다.

-1을 해서 3에 나누어떨어지는 방식으로 구현하는것이 아이디어의 핵심인것같다.

 

또한,

switch문을 통해서 for문처럼 길게하지 않고 구현하는게 깔끔하고 좋다..

switch문도 적극 활용하자.

반응형