프로그래머스

키패드 누르기

backend_fighting 2023. 1. 16. 02:51
728x90

[50점코드 1차시도]

import java.util.*;
class Solution {
    static int []dy = {0,0,1,-1};
    static int []dx = {1,-1,0,0};
    static String answer = "";
    static char [][] map ={{'1','2','3'},{'4','5','6'},{'7','8','9'},{'*','0','#'}};
    static int cur_LX=0;
    static int cur_LY=3;
    static int cur_Llen =0;
    
    static int cur_RX=2;
    static int cur_RY=3;
    static int cur_Rlen =0;
    static public void dfs(int[] numbers, String hand,int cur,int end_size)
    {
        if(cur == end_size)
        {
            return;
        }
            
        if(numbers[cur]==1 || numbers[cur]==4 || numbers[cur]==7)
        {
            for(int i=0;i<map.length;i++)
            {
                for(int j=0;j<map[i].length;j++)
                {
                    if(map[i][j]==Integer.toString(numbers[cur]).charAt(0))
                    {
                        cur_LX = j;
                        cur_LY = i;
                        // System.out.println(i + " " + j);
                    }
                }
            }
            
            answer+='L';
        }
        else if(numbers[cur]==3 || numbers[cur]==6 || numbers[cur]==9)
        {
            for(int i=0;i<map.length;i++)
            {
                for(int j=0;j<map[i].length;j++)
                {
                    if(map[i][j]==Integer.toString(numbers[cur]).charAt(0))
                    {
                        cur_RX = j;
                        cur_RY = i;
                        // System.out.println(i + " " + j);
                    }
                }
            }
            
            answer+='R';
        }
        else
        {
            int tempY=0;
            int tempX=0;
            
            for(int i=0;i<map.length;i++)
            {
                for(int j=0;j<map[i].length;j++)
                {
                    if(map[i][j]==Integer.toString(numbers[cur]).charAt(0))
                    {
                        tempX = j;
                        tempY = i;
                        
                        cur_Llen = Math.abs(i-cur_LY) + Math.abs(j-cur_LX);
                        cur_Rlen = Math.abs(i-cur_RY) + Math.abs(j-cur_RX);
                        // System.out.println(cur_Llen + " " + cur_Rlen);
                    }
                }
            }
            if(cur_Llen == cur_Rlen)
            {
                // System.out.println(numbers[cur]);
                if(hand.charAt(0)=='l')
                {
                    cur_LY = tempY;
                    cur_LX = tempX;
                    answer+='L';
                }
                else
                {
                    cur_RY = tempY;
                    cur_RX = tempX;
                    answer+='R';
                }
            }
            else if(cur_Llen ==1 || cur_Rlen ==1)
            {
                if(cur_Rlen ==1)
                {
                    answer+='R';
                    cur_RX = tempX;
                    cur_RY = tempY;
                }
                else
                {
                    answer+='L';
                    cur_LX = tempX;
                    cur_LY = tempY;
                }
                
            }
            else
            {
                // System.out.println(numbers[cur]);
                if(cur_Llen>cur_Rlen)
                {
                    cur_RY = tempY;
                    cur_RX = tempX;
                    answer+='R';
                }
                else if(cur_Llen<cur_Rlen)
                {
                    cur_LY = tempY;
                    cur_LX = tempX;
                    answer+='L';
                }
                else
                {
                    if(hand.charAt(0)=='l')
                    {
                        cur_LY = tempY;
                        cur_LX = tempX;
                        answer+='L';
                    }
                    else
                    {
                        cur_RY = tempY;
                        cur_RX = tempX;
                        answer+='R';
                    }
                }
            }
            
            
        }
        dfs(numbers,hand,cur+1,end_size);
    }
    public String solution(int[] numbers, String hand) {
        
        dfs(numbers,hand,0,numbers.length);
        return answer;
    }
}

 

처음에 abs를 한쪽에만 붙여줘서 계산이 이상하게 나왔다... 이것도 정말 오래걸렸다...

50점 맞는데 3시간 걸린듯... 이렇게해가지고 코딩테스트를 볼지 몰겄다... 하지만 꾸준히 하면 늘겠지...

 

[100점코드 2차시도]

 

import java.util.*;
class Solution {
    static int []dy = {0,0,1,-1};
    static int []dx = {1,-1,0,0};
    static String answer = "";
    static char [][] map ={{'1','2','3'},{'4','5','6'},{'7','8','9'},{'*','0','#'}};
    static int cur_LX=0;
    static int cur_LY=3;
    static int cur_Llen =0;
    
    static int cur_RX=2;
    static int cur_RY=3;
    static int cur_Rlen =0;
    static public void dfs(int[] numbers, String hand,int cur,int end_size)
    {
        if(cur == end_size)
        {
            return;
        }
            
        if(numbers[cur]==1 || numbers[cur]==4 || numbers[cur]==7)
        {
            for(int i=0;i<map.length;i++)
            {
                for(int j=0;j<map[i].length;j++)
                {
                    if(map[i][j]==Integer.toString(numbers[cur]).charAt(0))
                    {
                        cur_LX = j;
                        cur_LY = i;
                        // System.out.println(i + " " + j);
                    }
                }
            }
            
            answer+='L';
        }
        else if(numbers[cur]==3 || numbers[cur]==6 || numbers[cur]==9)
        {
            for(int i=0;i<map.length;i++)
            {
                for(int j=0;j<map[i].length;j++)
                {
                    if(map[i][j]==Integer.toString(numbers[cur]).charAt(0))
                    {
                        cur_RX = j;
                        cur_RY = i;
                        // System.out.println(i + " " + j);
                    }
                }
            }
            
            answer+='R';
        }
        else
        {
            int tempY=0;
            int tempX=0;
            
            for(int i=0;i<map.length;i++)
            {
                for(int j=0;j<map[i].length;j++)
                {
                    if(map[i][j]==Integer.toString(numbers[cur]).charAt(0))
                    {
                        tempX = j;
                        tempY = i;
                        
                        cur_Llen = Math.abs(i-cur_LY) + Math.abs(j-cur_LX);
                        cur_Rlen = Math.abs(i-cur_RY) + Math.abs(j-cur_RX);
                        // System.out.println(cur_Llen + " " + cur_Rlen);
                    }
                }
            }
            if(cur_Llen == cur_Rlen)
            {
                // System.out.println(numbers[cur]);
                if(hand.charAt(0)=='l')
                {
                    cur_LY = tempY;
                    cur_LX = tempX;
                    answer+='L';
                }
                else
                {
                    cur_RY = tempY;
                    cur_RX = tempX;
                    answer+='R';
                }
            }
            else if(cur_Llen>cur_Rlen)
            {
                cur_RY = tempY;
                cur_RX = tempX;
                answer+='R';
            }
            else if(cur_Llen<cur_Rlen)
            {
                cur_LY = tempY;
                cur_LX = tempX;
                answer+='L';
            }
            else
            {
                if(hand.charAt(0)=='l')
                {
                    cur_LY = tempY;
                    cur_LX = tempX;
                    answer+='L';
                }
                else
                {
                    cur_RY = tempY;
                    cur_RX = tempX;
                    answer+='R';
                }
            }
        
        }
        dfs(numbers,hand,cur+1,end_size);
    }
    public String solution(int[] numbers, String hand) {
        
        dfs(numbers,hand,0,numbers.length);
        return answer;
    }
}

 

남의코드 구조를 보고 그냥 맞게 변형한건데 어느케이스에서 위코드가 안됐는지는 아직 분석을 못했다.

 

지금 새벽 3시 20분이므로 잠을 자야겠다.

728x90