[ 키패드 누르기 ]
https://programmers.co.kr/learn/courses/30/lessons/67256
- 이중 for문(i, j)을 돌렸을 때, j=0 일 때 왼손을 가지고 j=2 일 때 오른손을 입력
- 배열 LH와 RH는 마지막 번호를 눌렀을 때의 그 번호의 위치(인덱스)를 표시
- 이중 for문으로 배열 전체를 탐색하여 입력받은 숫자의 위치를 input[0]과 input[1]의 각각 넣어주었다.
- j=0이면 왼손 위치(LH)의 요소를 변경하고 "L"을 answer에 추가, j=2이면 오른손 위치(RH)의 요소를 변경하고 "R"을 추가 j=1이면 Math.abs()를 이용하여 현재 손 위치에서 눌러야하는 번호의 위치까지 몇칸을 움직여야하는지 구하고 적은 값이 answer에 추가되며, 값이 같을시 입력받은 사용하는 손을 추가.
- answer을 반환.
class Solution {
public String solution(int[] numbers, String hand) {
String answer = "";
int key[][] = {{1, 2, 3},
{4, 5, 6,},
{7, 8, 9},
{42, 0 ,35}};
int LH[] = {3, 0};
int RH[] = {3, 2};
int input[] = new int[2];
for(int p=0; p<numbers.length; p++) {
for(int i=0; i<4; i++) {
for(int j=0; j<3; j++) {
if(key[i][j] == numbers[p]) {
input[0] = i;
input[1] = j;
if(j==0) {
LH[0] = i;
LH[1] = j;
answer += "L";
}
else if(j==2) {
RH[0] = i;
RH[1] = j;
answer += "R";
}
else if(j==1) {
int L = Math.abs((LH[0] - input[0])) + Math.abs((LH[1] - input[1]));
int R = Math.abs((RH[0] - input[0])) + Math.abs((RH[1] - input[1]));
if(L>R) {
answer += "R";
RH[0] = i;
RH[1] = j;
}
else if(L<R) {
answer += "L";
LH[0] = i;
LH[1] = j;
}
else if(L==R) {
answer += hand.toUpperCase().toCharArray()[0];
if(hand.toUpperCase().equals("RIGHT")) {
RH[0] = i;
RH[1] = j;
}
else if(hand.toUpperCase().equals("LEFT")) {
LH[0] = i;
LH[1] = j;
}
}
}
}
}
}
}
return answer;
}
}
Math.abs()란? 괄호안에 있는 값의 절대값을 구해주는 함수
처음에 어떻게 헤쳐나갈까 생각을 하다가
손이 위 아래로(i) 움직이면 +3/-3 양옆으로(j) 움직이면 +1/-1을 i(3), j(1)에 해당하는 값에 각각 움직인 횟수를 곱해 왼손과 오른손중 낮은 값을 계산하여 구하려하였는데 +3과 -3, +1과 -1은 딱히 신경 안써도 되는 부분이여서
지금 왼손 오른손 위치에서 목표 지점까지의 좌표로 가기위해 몇칸을 움직였는지 생각하면 풀기 편했다. 카카오문제라 걱정을 했지만, 차근차근 풀다보니 풀어볼 수 있었고 풀은 기분은 짜릿했다.