반응형
필자가 작성한 코드는 손가락을 객체로 만들어서 Left, Right 손가락의 위치를 업데이트하는 방식으로 만들었다.
class Finger {
int num, line;
Finger(int line, int num) {
this.line = line;
this.num = num;
}
int plusColumn() {
if (num == 2 || num == 5 || num == 8 || num == 0) {
return 0;
} else return 1;
}
}
finger의 현재 행은 line이고, 구체적인 실제 숫자는 num에 들어간다.
해당 객체의 plusColumn은 손가락의 위치가 가운데열에있으면 0을 리턴, 아니면 1을 리턴해서 가로방향 움직임을 뜻한다.
잠깐 고민한 점 : 행 위치를 return하는 메소드.
int findline(int finger) {
if (finger <= 3 && finger >= 1) {
return 0;
} else if (finger >= 4 && finger <= 6) {
return 1;
} else if (finger >= 7 && finger <= 9) {
return 2;
} else if (finger == 0 || finger == 10 || finger == 11) {//10, 11== * #
return 3;
} else {
return 0;
}
}
*,#을 어떻게 처리해서 처음 위치를 어떻게 잡느냐였는데, 임의로 10,11이라는 숫자를 부여해서 해당값일때는 0이랑 같은 행으로 처리했다.
if문은 크게 세가지로 나눈다.
1. 왼쪽열, 즉 왼손만 누를수 있는 부분
2. 오른쪽열, 즉 오른손만 누를수 있는 부분
3. 가운데열, 양손중 비교해야되는 부분 => 세부적인 if문으로 들어간다.
전체코드
class Solution {
public String solution(int[] numbers, String hand) {
String answer = "";
Finger Lfinger = new Finger(3, 10);
Finger Rfinger = new Finger(3, 11);
for (int i = 0; i < numbers.length; i++) {
int valLine = findline(numbers[i]);
//2580일때
if (numbers[i] == 1 || numbers[i] == 4 || numbers[i] == 7) {//왼쪽라인or오른쪽라인인경우
Lfinger.num = numbers[i];
Lfinger.line = valLine;
answer += "L";
} else if (numbers[i] == 3 || numbers[i] == 6 || numbers[i] == 9) {//왼쪽라인or오른쪽라인인경우
Rfinger.num = numbers[i];
Rfinger.line = valLine;
answer += "R";
} else {//2,5,8,0
int left = Math.abs(Lfinger.line - valLine) + Lfinger.plusColumn();
int right = Math.abs(Rfinger.line - valLine) + Rfinger.plusColumn();
System.out.println("2580else구문 : " +numbers[i] + "에서 L/R값:" + left +"/" +right);
//왼쪽이 더 가까운경우
if (left < right) {
Lfinger.num = numbers[i];
Lfinger.line = valLine;
answer += "L";
} else if (left > right){
Rfinger.num = numbers[i];
Rfinger.line = valLine;
answer += "R";
} else {//같을경우 왼손잡이냐 오른손잡이냐
// System.out.println(left +"/" + right);
// System.out.println("같음!" + numbers[i]);
if (hand.equals("left")) {//왼손잡이
Lfinger.num = numbers[i];
Lfinger.line = valLine;
answer += "L";
} else {//오른손잡이
Rfinger.num = numbers[i];
Rfinger.line = valLine;
answer += "R";
}
}
}
}
return answer;
}
int findline(int finger) {
if (finger <= 3 && finger >= 1) {
return 0;
} else if (finger >= 4 && finger <= 6) {
return 1;
} else if (finger >= 7 && finger <= 9) {
return 2;
} else if (finger == 0 || finger == 10 || finger == 11) {//10, 11== * #
return 3;
} else {
return 0;
}
}
class Finger {
int num, line;
Finger(int line, int num) {
this.line = line;
this.num = num;
}
int plusColumn() {
if (num == 2 || num == 5 || num == 8 || num == 0) {
return 0;
} else return 1;
}
}
}
다른사람 코드
class Solution {
int tempL = 10;
int tempR = 12;
String myhand;
public String solution(int[] numbers, String hand) {
myhand = ((hand.equals("right"))? "R": "L");
String answer = "";
for(int i=0 ; i< numbers.length ; i++) {
switch(numbers[i]) {
case 1: case 4: case 7:
answer += "L";
tempL = numbers[i];
break;
case 3: case 6: case 9:
answer += "R";
tempR = numbers[i];
break;
default:
String tempHand = checkHand(numbers[i]);
if(tempHand.equals("R"))
tempR = numbers[i] + ((numbers[i] == 0)? 11:0);
else tempL = numbers[i] + ((numbers[i] == 0)? 11:0);
answer += tempHand;
break;
}
}
return answer;
}
private String checkHand(int tempNum) {
int leftDistance = 0;
int rightDistance = 0;
if(tempNum == 0) tempNum = 11;
leftDistance = Math.abs((tempNum-1)/3 - (tempL-1)/3) + Math.abs((tempNum-1)%3 - (tempL-1)%3);
rightDistance = Math.abs((tempNum-1)/3 - (tempR-1)/3) + Math.abs((tempNum-1)%3 - (tempR-1)%3);
System.out.println(tempNum + ": " + leftDistance + ", " + rightDistance);
return ((leftDistance == rightDistance)? myhand: (leftDistance > rightDistance)? "R": "L");
}
}
수학적으로 코드를 짜보려고했는데, 잘 안됐었는데 위 코더는 그런식으로 구현하는데 성공한것 같다.
-1을 해서 3에 나누어떨어지는 방식으로 구현하는것이 아이디어의 핵심인것같다.
또한,
switch문을 통해서 for문처럼 길게하지 않고 구현하는게 깔끔하고 좋다..
switch문도 적극 활용하자.
반응형
'코딩테스트 > Java' 카테고리의 다른 글
(2018 카카오) [1차] 다트게임 Java (0) | 2020.12.30 |
---|---|
(2018 카카오) [1차] 비밀지도 Java (0) | 2020.12.28 |
(2019 카카오) 실패율 Java (0) | 2020.12.21 |
(2019 카카오)크레인 인형뽑기 게임 Java (0) | 2020.12.18 |
[JAVA] 백준 "단지번호붙이기" (0) | 2020.12.03 |