n % 3 == 1
을 만족합니다.n % 3 == 0
을 만족합니다.n % 3 == 2
를 만족합니다.class Solution {
private Hand leftHand = new Hand(10, "left"); // 왼손: *을 10으로 치환
private Hand rightHand = new Hand(12, "right"); // 오른손 #을 12로 치환
public String solution(int[] numbers, String hand) {
StringBuilder stb = new StringBuilder();
for(int number : numbers) { // 눌러야 할 숫자를 가져옴
if(number % 3 == 1) { // n % 3 == 1 경우 왼손
stb.append("L");
leftHand.setPosition(number);
}
else if(number != 0 && (number % 3 == 0)) { // 0이 아니고 n % 3 == 3 경우 오른손
stb.append("R");
rightHand.setPosition(number);
}
else { // 가운데 숫자들
String properHand = findProperHand(number, hand);
stb.append(properHand);
}
}
return stb.toString();
}
String findProperHand(int number, String hand) {
int distanceFromLeft = calculateDistance(leftHand, number); // 왼손거리 계산
int distanceFromRight = calculateDistance(rightHand, number); // 오른손거리 계산
if(distanceFromLeft == distanceFromRight) { // 두개가 같으면
if(hand.equals(rightHand.getRightOrLeftStr())) { // 주 사용 손이 오른손이면
rightHand.setPosition(number); // 오른손 위치 변경
return "R"; // 해당 숫자는 오른손으로 눌러야함
}
else { // 주 사용손이 왼손이면
leftHand.setPosition(number); // 왼손 위치 변경
return "L"; // 해당 숫자는 왼손으로 눌러야함
}
} else if (distanceFromLeft < distanceFromRight) { // 왼손이 가까우면
leftHand.setPosition(number); // 왼손 위치 변경
return "L"; // 해당 숫자는 왼손으로 눌러야함
}
else { // 오른손이 가까우면
rightHand.setPosition(number); // 오른손 위치 변경
return "R"; // 해당 숫자는 오른손으로 눌러야함
}
}
int calculateDistance(Hand hand, int number) {
int position = hand.getPosition();
if (position == 0) position = 11; // 0은 11로 치환한다
if (number == 0 ) number = 11;
int positionX = (position - 1) / 3;
int positionY = (position - 1) % 3;
int numX = (number - 1) / 3;
int numY = (number - 1) % 3;
int distance = Math.abs(positionX - numX) + Math.abs(positionY - numY);
return distance;
}
}
class Hand { // 자바의 객체지향성 활용하여 class 생성
private int position;
private String rightOrLeftStr;
Hand(int position, String rightOrLeftStr) {
this.position = position;
this.rightOrLeftStr = rightOrLeftStr;
}
public void setPosition(int position) {
this.position = position;
}
public int getPosition() {
return position;
}
public String getRightOrLeftStr() {
return rightOrLeftStr;
}
}