프로그래머스 Lv.1 2020 카카오 인턴십 키패드 누르기
순서대로 누를 번호가 담긴 배열 numbers, 왼손잡이인지 오른손잡이인 지를 나타내는 문자열 hand가 매개변수로 주어질 때, 각 번호를 누른 엄지손가락이 왼손인 지 오른손인 지를 나타내는 연속된 문자열 형태로 return하는 solution 함수를 작성하는 문제이다.
눌러야할 키패드의 위치(1/4/7, 2/5/8/0, 3/6/9)를 먼저 판별하고 (1/4/7)은 왼손, (3/6/9)는 오른손을 사용하는 것으로 판단한다. (2/5/8/0)은 눌러야할 키패드(target)과 왼손/오른손과의 거리(ld/rd)를 계산하여 거리가 가까운 손을 사용한다.
class Solution {
public String solution(int[] numbers, String hand) {
String answer = "";
StringBuilder sb = new StringBuilder();
int l = 10;
int r = 12;
for (int i = 0; i < numbers.length; i++) {
if (numbers[i] == 0 || numbers[i] % 3 == 2) { // 2 5 8 0
int target = numbers[i];
if (target == 0)
target = 11;
int ld = distance(target, l);
int rd = distance(target, r);
if (ld < rd) {
l = target;
sb.append('L');
} else if (rd < ld) {
r = target;
sb.append('R');
} else {
if (hand.equals("left")) {
l = target;
sb.append('L');
} else {
r = target;
sb.append('R');
}
}
} else if (numbers[i] % 3 == 1) { // 1 4 7
l = numbers[i];
sb.append('L');
} else { // 3 6 9
r = numbers[i];
sb.append('R');
}
}
answer = sb.toString();
return answer;
}
public int distance(int target, int n) {
int d = 0;
// keypad
// 1 (0.0) 2 (0.1) 3 (0.2)
// 4 (1.0) 2 (1.1) 3 (1.2)
// 7 (2.0) 2 (2.1) 3 (2.2)
// * (3.0) 0 (3.1) # (3.2)
int tx = (target-1) / 3;
int ty = target % 3;
if (ty > 0) {
ty--;
} else {
ty = ty + 2;
}
int nx = (n-1) / 3;
int ny = n % 3;
if (ny > 0) {
ny--;
} else {
ny = ny + 2;
}
int xd = tx - nx;
if (xd < 0)
xd = xd * (-1);
int yd = ty - ny;
if (yd < 0)
yd = yd * (-1);
d = xd + yd;
return d;
}
}