프로그래머스 level1)카카오 인턴] 키패드 누르기

하우르·2021년 7월 20일
0

링크 : [프로그래머스 level1)카카오 인턴] 키패드 누르기(https://programmers.co.kr/learn/courses/30/lessons/67256)

* 풀이

몇개월전에 못 푼문제 다시 보니 어렵지는 않았는데
거리를 어떤 방식으로 구할지 고민이 되었다.
만족스러운 방식은 결국 못찾았다. ㅠㅠ

과거 풀이

class Solution {
    static int[][] keypad = {{1,2,3},{4,5,6},{7,8,9},{-1,0,-1}};
    public static int[] ff(int num) {
		int[] xy = new int[2];
		for(int i=0; i<4;i++)
		{
			for(int j=0; j<3;j++)
			{
				if(keypad[i][j]==num)
				{
					xy[0] = i;
					xy[1] = j;
				}
			}
		}
		return xy;
	}

	public static int get_distance(int[] temp,int[] hand) {
		int num = 0;
		int x = hand[0];
		int y = hand[1];
		while(!(x==temp[0]&&y==temp[1]))
		{
			if(temp[0] > x)
			{
				x=+1;
				num++;
			}
			else if(temp[0]<x)
			{
				x=-1;
				num++;
			}

			if(temp[1] > y)
			{
				y=+1;
				num++;
			}
			else if(temp[1]<y)
			{
				y=-1;
				num++;
			}

		}
		return num;

	}

    public String solution(int[] numbers, String hand) {

		String answer = "";
	    int[] left_loc = {3,0};
	    int[] right_loc =  {3,2};

	    for(int num:numbers)
	    {
            if(num%3==1)
	        {
	            answer = answer+"L";
	            left_loc = ff(num);
	        }
	        else if(num%3==0)
	        {
	            answer = answer+"R";
	            right_loc= ff(num);
	        }
	        else
	        {
	            int[] temp = ff(num);
	            int left_dis = get_distance(temp, left_loc);
	            int right_dis = get_distance(temp, right_loc);

	            if(left_dis<right_dis)
	            {
	            	answer = answer+"L";
	            	left_loc =temp;
	            }
	            else if(left_dis>right_dis)
	            {
	            	answer = answer+"R";
		            right_loc= temp;
	            }
	            else {
	            	if(hand=="right")
	            	{
	            		answer = answer+"R";
			            right_loc= temp;
		            }
	            	else if(hand=="left")
	            	{
	            		answer = answer+"L";
	            		left_loc= temp;
		            }
	            }
	        }
	     }
        return answer;
    }
}

다시 보는데 내가 왜 이렇게 작성했는지 모르겠음

현재 풀이

public static String solution(int[] numbers, String hand) {
		StringBuilder builder = new StringBuilder();
		int[] x = {0,0,0,1,1,1,2,2,2,3,3,3};
		int[] y= {0,1,2,0,1,2,0,1,2,0,1,2};
		int l=10; //*
		int r=12; //#
		for(int i=0; i<numbers.length; i++)
		{
			if(numbers[i]==1 || numbers[i]==4|| numbers[i]==7) {
				l=numbers[i];
				builder.append("L");
			}
			else if(numbers[i]==3 || numbers[i]==6|| numbers[i]==9)
			{
				r=numbers[i];
				builder.append("R");
			}
			else //0,2,5,8
			{
				if(numbers[i]==0)
					numbers[i]=11;
				int temp_a = Math.abs(x[numbers[i]-1]-x[l-1])+Math.abs(y[numbers[i]-1]-y[l-1]);
				int temp_b = Math.abs(x[numbers[i]-1]-x[r-1])+Math.abs(y[numbers[i]-1]-y[r-1]);
				if(temp_a==temp_b)
				{
					if(hand.equals("right"))
					{
						r=numbers[i];
						builder.append("R");
					}
					else
					{
						l=numbers[i];
						builder.append("L");
					}
				}
				else if(temp_a<temp_b)
				{
					l=numbers[i];
					builder.append("L");
				}
				else
				{
					r=numbers[i];
					builder.append("R");
				}
			}
		}

		return builder.toString();
	}

2차원 배열까지 만들고 싶지 않아서 좌표를 1차원 배열에 넣고
1은 좌표가 0,0
0은 좌표가 3,1
이기 때문에 0과 1은 거리는 4이다.
이런식으로 거리를 구해줌

찾아보니 좌표를 구하는 계산식이 있었음
나도 규칙이 있었던거 같아서 3으로 나누기도하고 나머지도 구하곤 했는데
하다가 규칙 찾기 귀찮아서
적어줌 ㅠ
어쨋든 풀었다.

profile
주니어 개발자

0개의 댓글

관련 채용 정보