알고리즘 공부/프로그래머스
프로그래머스 코딩테스트 연습 - 2020 카카오 인턴십 - 키패드 누르기
HRuler
2020. 10. 6. 23:48
1. 문제
https://programmers.co.kr/learn/courses/30/lessons/67256?language=java
코딩테스트 연습 - 키패드 누르기
[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"
programmers.co.kr
2. 나의 풀이
class Solution {
public String solution(int[] numbers, String hand) {
String answer = "";
int L_location = -1;
int R_location = -1;
for(int i = 0; i < numbers.length; i = i + 1) {
if(numbers[i] % 3 == 1) {
answer += "L";
L_location = numbers[i];
}else if(numbers[i] != 0 && numbers[i] % 3 == 0) {
answer += "R";
R_location = numbers[i];
}else{
if(distance(numbers[i], L_location) < distance(numbers[i], R_location)) {
answer += "L";
L_location = numbers[i];
}else if(distance(numbers[i], R_location) < distance(numbers[i], L_location)) {
answer += "R";
R_location = numbers[i];
}else if(distance(numbers[i], R_location) == distance(numbers[i], L_location)) {
if(hand.equals("right")) {
answer += "R";
R_location = numbers[i];
}else if(hand.equals("left")) {
answer += "L";
L_location = numbers[i];
}
}
}
}
return answer;
}
int distance(int numbers, int location) {
int distance = 0;
if(numbers == 2) {
switch(location) {
case -1 : distance = 4;break;
case 1 : distance = 1;break;
case 2 : distance = 0;break;
case 3 : distance = 1;break;
case 4 : distance = 2;break;
case 5 : distance = 1;break;
case 6 : distance = 2;break;
case 7 : distance = 3;break;
case 8 : distance = 2;break;
case 9 : distance = 3;break;
case 0 : distance = 3;break;
}
}else if(numbers == 5) {
switch(location) {
case -1 : distance = 3;break;
case 1 : distance = 2;break;
case 2 : distance = 1;break;
case 3 : distance = 2;break;
case 4 : distance = 1;break;
case 5 : distance = 0;break;
case 6 : distance = 1;break;
case 7 : distance = 2;break;
case 8 : distance = 1;break;
case 9 : distance = 2;break;
case 0 : distance = 2;break;
}
}else if(numbers == 8) {
switch(location) {
case -1 : distance = 2;break;
case 1 : distance = 3;break;
case 2 : distance = 2;break;
case 3 : distance = 3;break;
case 4 : distance = 2;break;
case 5 : distance = 1;break;
case 6 : distance = 2;break;
case 7 : distance = 1;break;
case 8 : distance = 0;break;
case 9 : distance = 1;break;
case 0 : distance = 1;break;
}
}else if(numbers == 0) {
switch(location) {
case -1 : distance = 1;break;
case 1 : distance = 4;break;
case 2 : distance = 3;break;
case 3 : distance = 4;break;
case 4 : distance = 3;break;
case 5 : distance = 2;break;
case 6 : distance = 3;break;
case 7 : distance = 2;break;
case 8 : distance = 1;break;
case 9 : distance = 2;break;
case 0 : distance = 0;break;
}
}
return distance;
}
}
3. 다른 사람 풀이
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");
}
}