스마트폰 전화 키패드의 각 칸에 다음과 같이 숫자들이 적혀 있습니다.
이 전화 키패드에서 왼손과 오른손의 엄지손가락만을 이용해서 숫자만을 입력하려고 합니다.
맨 처음 왼손 엄지손가락은 * 키패드에 오른손 엄지손가락은 # 키패드 위치에서 시작하며, 엄지손가락을 사용하는 규칙은 다음과 같습니다.
순서대로 누를 번호가 담긴 배열 numbers, 왼손잡이인지 오른손잡이인 지를 나타내는 문자열 hand가 매개변수로 주어질 때, 각 번호를 누른 엄지손가락이 왼손인 지 오른손인 지를 나타내는 연속된 문자열 형태로 return 하도록 solution 함수를 완성해주세요.
numbers | hand | result |
---|---|---|
[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" |
풀이
- 1~0까지의 키패드 숫자를 좌표에 담는다. (*은 10, #은 12)
- 각 엄지손가락이 누른 위치를 leftIndex, rightIndex에 각각 저장한다.
- 숫자가 2, 5, 8, 0일 경우, 해당 숫자와 leftIndex, rightIndex의 거리를 계산한다. 한 칸당 거리가 1이므로 해당 x좌표 거리((해당 숫자 - index) / 3의 절댓값) , y좌표 거리((해당 숫자 - index) % 3의 절댓값)를 더해 더 가까운 거리를 판단한다.
public String solution(int[] numbers, String hand) {
String answer = "";
StringBuilder sb = new StringBuilder(answer);
int left = 10;
int right = 12;
for (int i : numbers) {
if ((i == 1) || (i == 4) || (i == 7)) {
sb.append("L");
left = i;
} else if ((i == 3) || (i == 6) || (i == 9)) {
sb.append("R");
right = i;
} else {
if(i == 0) i = 11;
int lDistance = (Math.abs(i - left) / 3) + (Math.abs(i - left) % 3);
int rDistance = (Math.abs(i - right) / 3) + (Math.abs(i - right) % 3);
if (lDistance == rDistance) {
if ("right".equals(hand)) {
sb.append("R");
right = i;
} else {
sb.append("L");
left = i;
}
} else if (lDistance > rDistance) {
sb.append("R");
right = i;
} else {
sb.append("L");
left = i;
}
}
}
answer = sb.toString();
return answer;
}
출처 -https://school.programmers.co.kr/learn/courses/30/lessons/67256