프로그래머스 키패드 누르기[Java]
접근법
x,y좌표를 저장하는 Point 클래스를 생성하여 해결하였다.
풀이
입력받은 수에 따라 1,4,7의 경우 left의 좌표를 변경시키며 L을 추가해 주었고
3,6,9의 경우 rigth의 좌표를 변경시키며 R을 추가해 주었다.
중간의 있는 수(0,2,5,8)의 경우 문제 그대로 가장 가까운 손가락은 찾아 이동해 주었다.
처음에 피타고라스 정의를 통해 해결하고자 하였으나 오답이였다. 문제를 다시 읽어보니 피타고라스 정의를 푸는게 아닌 좌 우로만 이동할 수 있다는 것을 알게 되었다. 문제를 잘 읽자....
전체적인 코드는 다음과 같다.
class Solution {
static class Point {
int x,y;
Point(int x, int y){
this.x = x;
this.y = y;
}
void setPoint(int x, int y){
this.x = x;
this.y = y;
}
}
static StringBuilder sb = new StringBuilder();
static Point left = new Point(4,1);
static Point right = new Point(4,3);
public String solution(int[] numbers, String hand) {
for(int i = 0 ; i<numbers.length; i++){
switch(numbers[i]) {
case 0 :
setMiddle(4,2, hand);
break;
case 1 :
left.setPoint(1,1);
sb.append('L');
break;
case 2 :
setMiddle(1,2,hand);
break;
case 3 :
right.setPoint(1,3);
sb.append('R');
break;
case 4 :
left.setPoint(2,1);
sb.append('L');
break;
case 5 :
setMiddle(2,2,hand);
break;
case 6 :
right.setPoint(2,3);
sb.append('R');
break;
case 7 :
left.setPoint(3,1);
sb.append('L');
break;
case 8 :
setMiddle(3,2,hand);
break;
case 9 :
right.setPoint(3,3);
sb.append('R');
break;
}
}
return sb.toString();
}
static int distance(Point a, Point b){
int dis = Math.abs(a.x - b.x) + Math.abs(a.y - b.y);
return dis;
}
static void setMiddle(int x, int y, String hand){
Point number = new Point(x,y);
double leftDis = distance(left, number);
double rightDis = distance(right, number);
if(leftDis > rightDis){
sb.append('R');
right.setPoint(x,y);
} else if(leftDis < rightDis){
sb.append('L');
left.setPoint(x,y);
} else{
if(hand.equals("right")){
sb.append("R");
right.setPoint(x,y);
} else{
sb.append("L");
left.setPoint(x,y);
}
}
}
}
Author And Source
이 문제에 관하여(프로그래머스 키패드 누르기[Java]), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@ppyooy336/프로그래머스-키패드-누르기Java저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)