numbers
순서대로 누를 번호가 담긴 배열 | [1, 3, 4, 5, 8, 2, 1, 4, 5, 9, 5] | 배열의 크기는 1 이상 1,000 이하, 원소의 값은 0 이상 9 이하인 정수
hand
왼손잡이인지 오른손잡이인 지를 나타내는 문자열 | "right" | "left" 또는 "right"
각 번호를 누른 엄지손가락이 왼손인 지 오른손인 지를 나타내는 연속된 문자열 형태로 return
2,5,8,0의 좌표를 Map에 저장하고, 왼손과 오른손이 2,5,8,0까지의 거리를 계산하여 ans에 추가
import java.util.*;
class Solution {
public String solution(int[] numbers, String hand) {
StringBuilder sb = new StringBuilder();
int[] leftHand = new int[]{3,0}, rightHand = new int[]{3,2};
boolean handFlag = hand.equals("right")?true:false;
Map<Integer, int[]> mid = new HashMap<>();
for(int m : new int[]{2,5,8,11}){
mid.put(m==11?0:m, new int[]{m/3, 1});
}
for(int num : numbers){
if(num == 1 || num == 4 || num == 7){
leftHand = new int[]{num/3, 0};
sb.append("L");
}else if(num == 3 || num == 6 || num == 9){
rightHand = new int[]{num/3-1, 2};
sb.append("R");
}else{
int[] midXY = mid.get(num);
int leftToMid = Math.abs(midXY[0] - leftHand[0]) + Math.abs(midXY[1] - leftHand[1])
, rightToMid = Math.abs(midXY[0] - rightHand[0]) + Math.abs(midXY[1] - rightHand[1]);
if(leftToMid == rightToMid){
if(handFlag){
rightHand = midXY;
sb.append("R");
}else{
leftHand = midXY;
sb.append("L");
}
}else if(leftToMid < rightToMid){
leftHand = midXY;
sb.append("L");
}else{
rightHand = midXY;
sb.append("R");
}
}
}
return sb.toString();
}
}
Tip : 구현문제에서 각 기능별로 메뉴판처럼 함수를 만들어 놓는 것이 가독성에 좋다.