public class keypad2 {
public static void main(String[] args) {
int[] numbers = {7, 0, 8, 2, 8, 3, 1, 5, 7, 6, 2};
String hand = "left";
String answer = solution(numbers, hand);
System.out.println(answer);
}
private static String solution(int[] numbers, String hand) {
int[] lp = {0,0};
int[] rp = {2,0};
int dl = 0;
int dr = 0;
int dl1 = 0;
int dl2 = 0;
int dr1 = 0;
int dr2 = 0;
String answer = "";
if(hand.equals("right")) {
hand="R";
}else {
hand="L";
}
for (int i = 0; i < numbers.length; i++) {
System.out.println("=====");
System.out.println(numbers[i]+" : "+answer);
System.out.println("=====");
if(numbers[i]==1) {
lp[0]=0;
lp[1]=3;
answer = answer+"L";
}else if(numbers[i]==4){
lp[0]=0;
lp[1]=2;
answer = answer+"L";
}else if(numbers[i]==7) {
lp[0]=0;
lp[1]=1;
answer = answer+"L";
}else if(numbers[i]==3) {
rp[0]=2;
rp[1]=3;
answer = answer+"R";
}else if(numbers[i]==6) {
rp[0]=2;
rp[1]=2;
answer = answer+"R";
}else if(numbers[i]==9) {
rp[0]=2;
rp[1]=1;
answer = answer+"R";
}
//LRLLLRLLLRR
//LRLLRRLLLRR
//LRLLLRLLLRR
if(numbers[i]==2) {
//1,3
dl1 = (1-lp[0]);
dl2 = (3-lp[1]);
dr1 = (1-rp[0]);
dr2 = (3-rp[1]);
dl = Math.abs(dl1)+Math.abs(dl2);
dr = Math.abs(dr1)+Math.abs(dr2);
if(dl>dr) {
answer = answer+"R";
rp[0]=1;
rp[1]=3;
}else if(dr>dl){
answer = answer+"L";
lp[0]=1;
lp[1]=3;
}else {
answer = answer+hand;
if(hand=="R") {
rp[0]=1;
rp[1]=3;
}else {
lp[0]=1;
lp[1]=3;
}
}
}else if(numbers[i]==5) {
//1,2
dl1 = (1-lp[0]);
dl2 = (2-lp[1]);
dr1 = (1-rp[0]);
dr2 = (2-rp[1]);
dl = Math.abs(dl1)+Math.abs(dl2);
dr = Math.abs(dr1)+Math.abs(dr2);
if(dl>dr) {
answer = answer+"R";
rp[0]=1;
rp[1]=2;
}else if(dr>dl){
answer = answer+"L";
lp[0]=1;
lp[1]=2;
}else {
answer = answer+hand;
if(hand=="R") {
rp[0]=1;
rp[1]=2;
}else {
lp[0]=1;
lp[1]=2;
}
}
}else if(numbers[i]==8) {
//1,1
dl1 = (1-lp[0]);
dl2 = (1-lp[1]);
dr1 = (1-rp[0]);
dr2 = (1-rp[1]);
dl = Math.abs(dl1)+Math.abs(dl2);
dr = Math.abs(dr1)+Math.abs(dr2);
if(dl>dr) {
answer = answer+"R";
rp[0]=1;
rp[1]=1;
}else if(dr>dl){
answer = answer+"L";
lp[0]=1;
lp[1]=1;
}else {
answer = answer+hand;
if(hand=="R") {
rp[0]=1;
rp[1]=1;
}else {
lp[0]=1;
lp[1]=1;
}
}
}else if(numbers[i]==0) {
//1,0
dl1 = (1-lp[0]);
dl2 = (0-lp[1]);
dr1 = (1-rp[0]);
dr2 = (0-rp[1]);
dl = Math.abs(dl1)+Math.abs(dl2);
dr = Math.abs(dr1)+Math.abs(dr2);
if(dl>dr) {
answer = answer+"R";
rp[0]=1;
rp[1]=0;
}else if(dr>dl){
answer = answer+"L";
lp[0]=1;
lp[1]=0;
}else {
answer = answer+hand;
if(hand=="R") {
rp[0]=1;
rp[1]=0;
}else {
lp[0]=1;
lp[1]=0;
}
}
}
System.out.println("dl : "+dl);
System.out.println("dr : "+dr);
System.out.println("lp : "+"("+lp[0]+","+lp[1]+")");
System.out.println("rp : "+"("+rp[0]+","+rp[1]+")");
System.out.println("answer : "+answer);
System.out.println("hand : "+hand);
}
return answer;
}
}
많이 길지만..이게 정답으로 제출한 코드!
public class keypad {
public static void main(String[] args) {
int[] numbers = {1, 3, 4, 5, 8, 2, 1, 4, 5, 9, 5};
String hand = "right";
String answer = solution(numbers, hand);
System.out.println(answer);
}
private static String solution(int[] numbers, String hand) {
int[] lp = {0,0};
int[] rp = {2,0};
int dl = 0;
int dr = 0;
String answer = "";
// hand = (hand=="right")? "R":"L";
if(hand.equals("right")) {
hand="R";
}else {
hand="L";
}
for (int i = 0; i < numbers.length; i++) {
System.out.println("=====");
System.out.println(numbers[i]+" : "+answer);
System.out.println("=====");
if(numbers[i]==1) {
lp[0]=0;
lp[1]=3;
answer = answer+"L";
}else if(numbers[i]==4){
lp[0]=0;
lp[1]=2;
answer = answer+"L";
}else if(numbers[i]==7) {
lp[0]=0;
lp[1]=1;
answer = answer+"L";
}else if(numbers[i]==3) {
rp[0]=2;
rp[1]=3;
answer = answer+"R";
}else if(numbers[i]==6) {
rp[0]=2;
rp[1]=2;
answer = answer+"R";
}else if(numbers[i]==9) {
rp[0]=2;
rp[1]=1;
answer = answer+"R";
}
//LRLLLRLLLRL
//LRLLLRLLRRL
//LRLLLRLLRRL
if(numbers[i]==2) {
//1,3
dl = (1-lp[0])*(1-lp[0]) + (3-lp[1])*(3-lp[1]);
dr = (1-rp[0])*(1-rp[0]) + (3-rp[1])*(3-rp[1]);
if(dl>dr) {
answer = answer+"R";
rp[0]=1;
rp[1]=3;
}else if(dr>dl){
answer = answer+"L";
lp[0]=1;
lp[1]=3;
}else {
answer = answer+hand;
if(hand=="R") {
rp[0]=1;
rp[1]=3;
}else {
lp[0]=1;
lp[1]=3;
}
}
}else if(numbers[i]==5) {
//1,2
dl = (1-lp[0])*(1-lp[0]) + (2-lp[1])*(2-lp[1]);
dr = (1-rp[0])*(1-rp[0]) + (2-rp[1])*(2-rp[1]);
if(dl>dr) {
answer = answer+"R";
rp[0]=1;
rp[1]=2;
}else if(dr>dl){
answer = answer+"L";
lp[0]=1;
lp[1]=2;
}else {
answer = answer+hand;
if(hand=="R") {
rp[0]=1;
rp[1]=2;
}else {
lp[0]=1;
lp[1]=2;
}
}
}else if(numbers[i]==8) {
//1,1
dl = (1-lp[0])*(1-lp[0]) + (1-lp[1])*(1-lp[1]);
dr = (1-rp[0])*(1-rp[0]) + (1-rp[1])*(1-rp[1]);
if(dl>dr) {
answer = answer+"R";
rp[0]=1;
rp[1]=1;
}else if(dr>dl){
answer = answer+"L";
lp[0]=1;
lp[1]=1;
}else {
answer = answer+hand;
if(hand=="R") {
rp[0]=1;
rp[1]=1;
}else {
lp[0]=1;
lp[1]=1;
}
}
}else if(numbers[i]==0) {
//1,0
dl = (1-lp[0])*(1-lp[0]) + (0-lp[1])*(0-lp[1]);
dr = (1-rp[0])*(1-rp[0]) + (0-rp[1])*(0-rp[1]);
if(dl>dr) {
answer = answer+"R";
rp[0]=1;
rp[1]=0;
}else if(dr>dl){
answer = answer+"L";
lp[0]=1;
lp[1]=0;
}else {
answer = answer+hand;
if(hand=="R") {
rp[0]=1;
rp[1]=0;
}else {
lp[0]=1;
lp[1]=0;
}
}
}
System.out.println("dl : "+dl);
System.out.println("dr : "+dr);
System.out.println("lp : "+"("+lp[0]+","+lp[1]+")");
System.out.println("rp : "+"("+rp[0]+","+rp[1]+")");
System.out.println("answer : "+answer);
}
return answer;
}
}
이건 먼저 작성했던 코드!!
문제에서 키패드에서 이동방법이 대각선은 없기에 더 가까운 손가락을 찾을때 방법이 달라 두가지로 풀게됐다.
다른사람의 풀이를 보니 Math.abs()에서 괄호안에서 연산을 하는 것과
A = ( B.equals(C) ) ? D : E;
에서 내부에 연산자를 사용할 수 있는 것등을 참고할 수 있었고
메소드를 더 세분화해서 만드는 감을 접해볼 수 있었다.
'코딩테스트 연습' 카테고리의 다른 글
배열내 세개의 숫자의 합이 소수인 개수 구하기. (0) | 2021.08.20 |
---|---|
a,b의 내적 구하기 (0) | 2021.08.20 |
문자열 영어로 변환된 것을 오로지 숫자로 변환 (0) | 2021.08.19 |
로또 (0) | 2021.07.30 |
코딩테스트 - 모의고사 (레벨 1) (0) | 2021.05.02 |