1. SOLUTION
특별한 알고리즘 없이 쌩구현 하면 되는 문제인데 눌러야 하는 번호가 2, 5, 8, 0일 경우가 조금 까다로웠다.
입력해야하는 번호와 현재 왼손&오른손의 거리를 구해 주어야 하는데, 이 거리 구하는 방법을 생각하는게 쉽지 않았다.
좌우로 움직여야 하는 거리 + 위아래로 움직여야 하는 거리를 계산해 주면 된다.
* 숫자 % 3이 1이라면 키패드에서 왼쪽 줄(1, 4, 7, 10), 2라면 가운데 줄(2, 5, 8, 11), 0이라면 오른쪽 줄(3, 6, 9, 12)
눌러야하는 번호와의 거리 = ((현재 번호 - 눌러야 하는 번호) % 3) + ((현재 번호 - 눌러야 하는 번호) / 3)
해당 식을 사용해서 왼손과 오른손의 거리를 구해준 후 문제에서 요구하는 사항대로 구현해주면 된다.
import java.util.*;
class Solution {
public String solution(int[] numbers, String hand) {
String answer = "";
// 왼쪽&오른쪽 손가락 첫 위치 설정
int left = 10;
int right = 12;
// numbers 돌아보면서 answer에 사용한 손가락 기록해주기
for(int now: numbers) {
// 누른 번호가 1, 4, 7일 경우 왼손 사용
if(now == 1 || now == 4 || now == 7){
answer += "L";
left = now;
// 누른 번호가 3, 6, 9일 경우 오른손 사용
} else if (now == 3 || now == 6 || now == 9){
answer += "R";
right = now;
}
먼저 왼손, 오른손의 첫 위치를 *(10), #(12)로 설정해 주고,
번호가 (1, 4, 7)일 때에는 왼손으로, (3, 6, 9)일 때는 오른손으로 눌러준다.
// 누른 번호가 2, 5, 8, 0일 경우 왼손과 오른손 중 번호에 더 가까운 손 사용
} else {
// 0은 11로 바꿔서 생각해주기
if (now == 0) now = 11;
// 현재 번호와 왼손, 오른손의 거리 구하기(좌우 거리 + 위아래 거리)
int left_d = Math.abs(now - left) % 3 + Math.abs(now - left) / 3;
int right_d = Math.abs(now - right) % 3 + Math.abs(now - right) / 3;
// 왼손 거리가 더 가까울 경우 왼손 사용
if (left_d < right_d) {
answer += "L";
left = now;
// 오른손 거리가 더 가까울 경우 오른손 사용
} else if (left_d > right_d) {
answer += "R";
right = now;
// 두 손 모두 거리가 같다면
} else {
// 왼손잡이는 왼손 사용
if (hand.equals("left")) {
answer += "L";
left = now;
// 오른손잡이는 오른손 사용
} else {
answer += "R";
right = now;
}
}
}
번호가 (2, 5, 8, 0)일 경우 해당 번호와 왼손&오른손의 거리를 구한 후 더 가까운 손을 사용해준다.
만약 두 손의 거리가 같다면 왼손잡이는 왼손, 오른손잡이는 오른손을 사용해주는 것으로 구현하면 된다.
2. CODE
import java.util.*;
class Solution {
public String solution(int[] numbers, String hand) {
String answer = "";
// 왼쪽&오른쪽 손가락 첫 위치 설정
int left = 10;
int right = 12;
// numbers 돌아보면서 answer에 사용한 손가락 기록해주기
for(int now: numbers) {
// 누른 번호가 1, 4, 7일 경우 왼손 사용
if(now == 1 || now == 4 || now == 7){
answer += "L";
left = now;
// 누른 번호가 3, 6, 9일 경우 오른손 사용
} else if (now == 3 || now == 6 || now == 9){
answer += "R";
right = now;
// 누른 번호가 2, 5, 8, 0일 경우 왼손과 오른손 중 번호에 더 가까운 손 사용
} else {
// 0은 11로 바꿔서 생각해주기
if (now == 0) now = 11;
// 현재 번호와 왼손, 오른손의 거리 구하기(좌우 거리 + 위아래 거리)
int left_d = Math.abs(now - left) % 3 + Math.abs(now - left) / 3;
int right_d = Math.abs(now - right) % 3 + Math.abs(now - right) / 3;
// 왼손 거리가 더 가까울 경우 왼손 사용
if (left_d < right_d) {
answer += "L";
left = now;
// 오른손 거리가 더 가까울 경우 오른손 사용
} else if (left_d > right_d) {
answer += "R";
right = now;
// 두 손 모두 거리가 같다면
} else {
// 왼손잡이는 왼손 사용
if (hand.equals("left")) {
answer += "L";
left = now;
// 오른손잡이는 오른손 사용
} else {
answer += "R";
right = now;
}
}
}
}
return answer;
}
}
댓글