공부/Algorithms w.Java
프로그래머스 67256-키패드 누르기; java
thegreatjy
2021. 11. 29. 16:24
728x90
class Solution {
public String solution(int[] numbers, String hand) {
String answer = "";
StringBuilder sb=new StringBuilder(); //정답 문자열
//current[0]=10 (왼손 *), current[1]=12 (오른손 #)
int[] current= new int[] {10, 12};
for(int i=0; i<numbers.length; i++) {
if(numbers[i]%3==1) {//1,4,7 왼손
sb.append('L');
current[0]=numbers[i];
}else if(numbers[i]%3==0 && numbers[i]!=0) {//3,6,9 오른손
sb.append('R');
current[1]=numbers[i];
}else {//2,5,8,0
if(numbers[i]==0) numbers[i]=11; //거리 계산을 위해 *==10, 0==11, #==12 로 변환
if(current[0]==0) current[0]=11;
if(current[1]==0) current[1]=11;
numbers[i]=numbers[i]-1;
int LDis=Math.abs((current[0]-1)/3-numbers[i]/3)+Math.abs((current[0]-1)%3-numbers[i]%3);
int RDis=Math.abs((current[1]-1)/3-numbers[i]/3)+Math.abs((current[1]-1)%3-numbers[i]%3);
if(LDis==RDis) {
if(hand.equals("right")) {
sb.append('R');
current[1]=numbers[i]+1;
}else {
sb.append('L');
current[0]=numbers[i]+1;
}
}else if(LDis<RDis){
sb.append('L');
current[0]=numbers[i]+1;
}else { //LD>RD
sb.append('R');
current[1]=numbers[i]+1;
}
}
}
answer=sb.toString();
return answer;
}
}
numbers[i]가
1) 1,4,7->L
2) 3,6,9->R
3) 2,5,8,0
현재 숫자인 num[i]과 왼쪽손가락과의 거리 LDis, 오른쪽 손가락과의 거리 RDis를 구해서 더 작은 거리를 가진 쪽을 선택한다.
3-1) 거리 구하기
키패드를 123/456/789/*0# -> 012/345/678/9 10 11 이렇게 바꾸어준다.
0 1 2
(0,0) (0,1) (0,2)
3 4 5
(1,0) (1,1) (1,2)
6 7 8
(2,0) (2,1) (2,2)
9 10 11
(3,0) (3,1) (3,2)
(n/3, n%3)을 통해, 위와 같이 (층, 열)을 나타낸다.
|층 차이|+|열 차이|는 두 키패드의 거리이다.
728x90