티스토리 뷰

0~9   * 와 # 문자를 포함한 숫자 키패드 상에서 numbers 배열 내용 순대로 입력 한다고 할때 사용한 손을 리턴하는 문제. 

다른 풀이를 보면 다 짧게 풀었지만, 생각나는대로 풀다보니 소스코드도 길고 비효율적인 코드 인거 같다. 

 

현재의 왼손과 오른손의 위치를 기억하기 위해서 변수 선언을 하여 넘겨주는 방식으로 구현하였다. 

StringBuilder를 선언해 구현 함수가 리턴하는 결과에 따라 'L' or 'R'을 append 한다. 

 

import java.util.*;

class Solution {
    
  //int[][] phone_num = new int[3][4];
    int[][] phone_num = {{1,2,3},{4,5,6},{7,8,9},{-1,0,-2}}; 
    
    public String solution(int[] numbers, String hand) {
        String answer = "";
        // insert array 
        //System.out.println(phone_num[0][2]);
        
        StringBuilder sb = new StringBuilder();
        
        int lefts = -1;
        int rights = -2; 
      
        for(int i=0; i<numbers.length ; i++){
            System.out.println("a"+i);
            
            if(numbers[i]==1||numbers[i]==4||numbers[i]==7){
                sb.append("L");
                lefts=numbers[i];
            }
            else if(numbers[i]==3||numbers[i]==6||numbers[i]==9){
                sb.append("R");
                rights=numbers[i];
            }
            else{
            int ret=0;
            ret= rethands(lefts, rights, numbers[i], hand); // distinct  left or right ; 
            //then update position 
            if(ret==1){  //left
                lefts=numbers[i];
                sb.append("L");
            }
            else if(ret==2){ // right
                rights = numbers[i];
                sb.append("R");
            }
            else{  //err 
                
                
            }
          }
        }
        // get distance , if same then using hand 
        System.out.println(sb);
        
        answer = sb.toString();
        
        return answer;
        
    }
    
    public int rethands(int left, int right, int num , String hands){
        // return -1 : false  ,   1 - left , 2 - right
        int ret = -1; 
        int a_x=0;
        int a_y=0;
        int b_x=0;
        int b_y=0;
        int n_x=0;
        int n_y=0;
        
        for(int i=0; i<4; i++){
            for(int j=0; j<3; j++){
                 if(phone_num[i][j]==left){
                     a_x=i;
                     a_y=j;
                 }   
                if(phone_num[i][j]==right){
                     b_x=i;
                     b_y=j;
                 }
                if(phone_num[i][j]==num){
                     n_x=i;
                     n_y=j;
                 }
            }
        }
        
        //System.out.println(a_x+","+a_y+","+b_x+","+b_y+","+n_x+","+n_y);
        int diff_a = Math.abs(n_x-a_x)+Math.abs(n_y-a_y);
        int diff_b = Math.abs(n_x-b_x)+Math.abs(n_y-b_y);
        
        if(diff_a>diff_b){
            ret = 2; 
        }
        else if(diff_a==diff_b){
            if(hands.compareTo("right")==0){
                ret=2;
            }
            else{
                ret =1; 
            }
        }
        else{
            ret = 1;
        }
        
        
        return ret; 
    }
}

https://programmers.co.kr/learn/courses/30/lessons/67256

 

코딩테스트 연습 - 키패드 누르기

[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

 

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31