코딩테스트/프로그래머스
[키패드 누르기]
애플쩀
2022. 6. 14. 07:28
package soltest;
import java.util.Iterator;
//case문으로 L=1,4,7,* / R= 3,6,9,# 나누기
//처음에는 쉽게 값-값으로 구하려고 햇으나
//왼손위치 :4 , 오른손위치:2 -> 눌러야할것 5
//이 예제를 보니 안될 것같아 자리 배열을 만들어주기
//2,5,8,0은 거리를 계산해서, 거리가 같다면 --손잡이로
//정답은 string 문자열에 추가
public class Soltest4 {
public String solution(int[] numbers, String hand) {
//어떤 손잡이인지,넣어주기
String hands= (hand.equals("left"))? "L":"R";
String answer = "";
//오른손 왼손 초치 위치 등록
int leftPos=10; //*
int rightPos=12; //#
//*은 10, 0은 11, #은 12
//값을 가져올 때 어려운것같아서 바꿈
//각각의 숫자에 -1한 것에 ,3으로 나눈 몫, 3으로 나눈 나머지
// int[][] numPos= {{0,0},{0,1},{0,2},
// {1,0},{1,1},{1,2},
// {2,0},{2,1},{2,2},
// {3,0},{3,1},{3,2 }};
//기본적인 룰 위치 등록 , 2580은 위치계산
//기본적인 룰 등록 , 2580 defualt로 빼서 위치계산
//for문을 넘버 길이만큼 돌려주고,
for (int i = 0; i < numbers.length; i++) {
switch(numbers[i]) { //스위치로
case 1: case 4: case 7: //이거는 왼쪽값이니까
answer+="L"; //반환할 answer에 추가해주고
leftPos=numbers[i]; //왼손에 마지막위치 저장
break;
case 3: case 6: case 9: //이거는 오른손이니까
answer+="R"; //반환할 answer에 추가해주고
rightPos=numbers[i]; //오른손에 마지막위치 저장
break;
default: //2,5,8,0
if(numbers[i]==0) numbers[i]=11; //0은 11로 처리
//키패드가 위아래로 3차이, 양옆으로 1차이인 것을 이용해서 아래와 같이 거리를 구하는 식을 이용
int leftDis=(Math.abs(numbers[i]-leftPos))/3+(Math.abs(numbers[i]-leftPos))%3;
int rightDis=(Math.abs(numbers[i]-rightPos))/3+(Math.abs(numbers[i]-rightPos))%3;
//왼쪽이 차이가 작으면 위에처럼 대입해주고
if(leftDis<rightDis) { answer+="L"; leftPos=numbers[i];}
//반대로 오른쪽이 거리가 작을때
else if(leftDis>rightDis) {answer+="R"; rightPos=numbers[i];}
else if(leftDis==rightDis) {//거리가 같다면 손잡이에 따라 값을 대입해주고
if(hands.equals("L")) { answer+="L"; leftPos=numbers[i];}
else {answer+="R"; rightPos=numbers[i];}
}
}
}
return answer; //답반환
}
}
//
//int leftDis=(Math.abs(numbers[i]-leftPos));
//int rightDis=(Math.abs(numbers[i]-rightPos));
//왼 4, 오 2 눌러야하는것 5 했을때 정답은 거리가 같은데,
//저렇게 하면 거리가 왼쪽 1, 오른쪽 3 이렇게 차이나서 왼쪽이 더 가깝다고 계산됨