프로그래머스 레벨 1 키패드 누르기 알고리즘 (JAVA)
오늘 푼 문제는
프로그래머스 레벨 1 키패드다
모든 코드는 GitHub 에 올려놓았다.
드디어 프로그래머스 레벨 1 마지막 문제다 ( sql 포함 )
https://programmers.co.kr/learn/courses/30/lessons/67256
코딩테스트 연습 - 키패드 누르기
[1, 3, 4, 5, 8, 2, 1, 4, 5, 9, 5] "right" "LRLLLRLLRRL" [7, 0, 8, 2, 8, 3, 1, 5, 7, 6, 2] "left" "LRLLRRLLLRR" [1, 2, 3, 4, 5, 6, 7, 8, 9, 0] "right" "LLRLLRLLRL"
programmers.co.kr
코드는..
ㅇ
class Solution {
public String solution(int[] numbers, String hand) {
StringBuilder answer = new StringBuilder();
int left = 42;
int right = 35;
for(int i=0; i<numbers.length; i++) {
int a = numbers[i];
if(numbers[i] == 1 || numbers[i] == 4 || numbers[i] == 7 || left == numbers[i]) {
left = numbers[i];
answer.append("L");
} else if(numbers[i] == 3 || numbers[i] == 6 || numbers[i] == 9 || right == numbers[i]) {
right = numbers[i];
answer.append("R");
} else {
if(distance(left,right,numbers[i], hand)) {
right = numbers[i];
answer.append("R");
} else {
left = numbers[i];
answer.append("L");
}
}
}
return answer.toString();
}
private boolean distance (int left, int right, int num , String hand) { // right 가까우면 ture // left 가 가까우면 false
int[] leftDistance = new int[2];
int[] rightDistance = new int[2];
int[] numArr = new int[2];
int[][] key = new int[][]{
{1,2,3},
{4,5,6},
{7,8,9},
{42,0,35}
};
for(int i=0; i<key.length; i++) {
for(int j=0; j<key[j].length; j++) {
if(left == key[i][j]) {
leftDistance[0] = i;
leftDistance[1] = j;
}
if(right == key[i][j]) {
rightDistance[0] = i;
rightDistance[1] = j;
}
if(num == key[i][j]) {
numArr[0] = i;
numArr[1] = j;
}
}
}
int leftNum = Math.abs(numArr[0] - leftDistance[0]) + Math.abs(numArr[1] - leftDistance[1]);
int rightNum = Math.abs(numArr[0] - rightDistance[0]) + Math.abs(numArr[1] - rightDistance[1]);
if(leftNum == rightNum) {
if(hand.equals("right")) {
return true;
} else {
return false;
}
}
return rightNum < leftNum;
}
}
더 짧게 줄일 수 있을 거 같지만..
풀다가 자버려서 중간까지만 그냥 빠르게 풀었다..
1 4 7 은 무조건 왼손이고
3 6 9는 오른손이니 if 문으로 걸러준다.
나머지 2580 이문제인데
현재 손의 위치의 index를 기준으로
이동거리를 계산해준다
예를 들자면
현재 왼손은 4고 , 오른손은 3 눌러야 할 키패드는 5번이다
그럼 왼손은 1,0 , 오른손은 0,2 , 눌러야 할 5번은 1,1이다
계산을 하면 이렇게 된다
각 자릿수만큼 빼준다. 그리고 음수일 경우 양수로 바꿔준 후 더해준다.
왼손 : ( 1-1) + ( 0 - 1 ) > 0 + -1 = -1이다 -1을 음수를 양수로 변환시키면
1이 되고 4에서 5를 누르려면 1칸 동일하다.
오른손: ( 0 - 1) + ( 2 - 1 ) = -1 + 1이다 여기도 음수를 양수로 변경해주고. 더하면
2가 된다 3에서 5까지의 거리는 2다..
이렇게 낮은 수의 손으로 클릭을 시켜주면 된다..!
주말이나.. 시간 날 때.. 2 5 8 0 계산하는 부분을 다듬어 봐야겠다
너무 더럽다..
아무튼!
프로그래머스 레벨 1 전부 풀었다!!
이제 알고리즘 책 좀 보고 2 레벨에 도전할 예정이다..