반응형
풀이>
키패드를 2차원 배열로 구성한다
1 2 3
[0,0] [0,1] [0,2]
4 5 6
[1,0] [1,1] [1,2]
7 8 9
[2,0] [2,1] [2,2]
* 0 #
[3,0] [3,1] [3,2]
배열 구성을... 보이는대로 거꾸로 적용하였는데
손가락의 위치와의 키패드의 거리를 구하기 위해 구현한 것이라 문제 없을 것 같다!
ex) 1 => [3,0] / 2 => [3,1] / 3 => [3,2]
4 => [2,0]
1,4,7 은 왼손
3,6,9 는 오른손 누른것을 추가해주고,
2,5,8,0은 현재 왼손,오른손의 위치와 키패드와의 거리를 계산
거리 차이가 적은 손을 답에 추가하고
거리가 같다면 , 어느 손잡이인지 검사 후(문제에서 주어지는 hand) 추가.
public class Programmers17 {
public static void main(String[] args) {
//테스트용 입력 정의
int[] numbers = { 7, 0, 8, 2, 8, 3, 1, 5, 7, 6, 2 };
String hand = "left";
String answer="";
String[][] keyPad = { { "1", "2", "3" },
{ "4", "5", "6" },
{ "7", "8", "9" },
{ "*", "0", "#" } };
//시작 손 위치
int[] left = { 3, 0 };
int[] right = { 3, 2 };
for (int i = 0; i < numbers.length; i++) {
for (int j = 0; j < keyPad.length; j++) {
//현재 눌러야 하는 번호
String curNumString = String.valueOf(numbers[i]);
if (curNumString.equals(keyPad[j][0])) {
// 1,4,7
answer+="L";
//왼손가락 위치저장
left[0] = j;
left[1] = 0;
break;
} else if (curNumString.equals(keyPad[j][2])) {
// 3,6,9
answer+="R";
//오른손가락 위치저장
right[0] = j;
right[1] = 2;
break;
} else if (curNumString.equals(keyPad[j][1])) {
// 2,5,8,0
//왼손의 이동거리
int l = Math.max(left[0], j) - Math.min(left[0], j)
+ Math.max(left[1], 1) - Math.min(left[1], 1);
//오른손의 이동거리
int r = Math.max(right[0], j) - Math.min(right[0], j)
+ Math.max(right[1], 1)
- Math.min(right[1], 1);
//이동거리가 짧은 손, 이동거리가 같다면 어느손잡이인지 확인 후 해당 손 이동
String moveHand=l > r ? "R" : l == r ? hand.equals("right") ? "R" : "L" : "L";
answer+=moveHand;
//이동후 손가락 위치 저장
if (moveHand.equals("L")) {
left[0] = j;
left[1] = 1;
} else {
right[0] = j;
right[1] = 1;
}
break;
} else {
continue;
}
}
}
//System.out.println(answer);
return answer;
}
}
반응형
'알고리즘 > 문제풀이' 카테고리의 다른 글
[JAVA] 프로그래머스 - 숫자 문자열과 영단어 (0) | 2021.08.22 |
---|---|
[JAVA]프로그래머스 - 실패율 (0) | 2021.01.02 |
[JAVA]프로그래머스 - 문자열 내 마음대로 정렬하기 (0) | 2020.12.06 |
[JAVA]프로그래머스 - 문자열 내 p와 y의 개수 (0) | 2020.12.05 |
[JAVA]프로그래머스 - 크레인 인형뽑기 게임 (0) | 2020.12.02 |