프로그래머스 키패드 누르기 (Java,자바)

jonghyukLee·2021년 9월 7일
0

이번에 풀어본 문제는
프로그래머스 키패드 누르기 입니다.

📕 문제 링크

❗️코드

import java.util.*;
class Pad
{
    int x,y;
    
    public Pad(int x, int y)
    {
        this.x = x;
        this.y = y;
    }
}
class Solution {
    static Pad left,right;
    public String solution(int[] numbers, String hand) {
        Pad [] pad = new Pad[10];
        left = new Pad(3,0);
        right = new Pad(3,2);
        
        int tmpNum = 1;
        for(int i = 0; i < 3; ++i)
        {
            for(int j = 0; j < 3; ++j)
            {
                pad[tmpNum++] = new Pad(i,j);
            }
        }
        pad[0] = new Pad(3,1);
        
        StringBuilder sb = new StringBuilder();
        for(int number : numbers)
        {
            if(number == 1 || number == 4 || number == 7)
            {
                sb.append("L");
                left.x = pad[number].x;
                left.y = pad[number].y;
                continue;
            }
            else if(number == 3 || number == 6 || number == 9)
            {
                sb.append("R");
                right.x = pad[number].x;
                right.y = pad[number].y;
                continue;
            }
            else
            {
                int fromLeft = Math.abs(left.x - pad[number].x) + Math.abs(left.y - pad[number].y);
                int fromRight = Math.abs(right.x - pad[number].x) + Math.abs(right.y - pad[number].y);
                if(fromLeft > fromRight)
                {
                    sb.append("R");
                    right.x = pad[number].x;
                    right.y = pad[number].y;
                }
                else if(fromLeft < fromRight)
                {
                    sb.append("L");
                    left.x = pad[number].x;
                    left.y = pad[number].y;
                }
                else
                {
                    if(hand.equals("left"))
                    {
                        sb.append("L");
                        left.x = pad[number].x;
                        left.y = pad[number].y;
                    }
                    else
                    {
                        sb.append("R");
                        right.x = pad[number].x;
                        right.y = pad[number].y;
                    }
                }
            }
        }
        return sb.toString();
    }
}

📝 풀이

카카오 인턴십 기출문제입니다.
pad 배열은 인덱스가 해당 번호가 되며 각각 자신의 번호에 맞는 좌표값을 가집니다. 주어진 numbers 배열을 탐색하며 2,5,8,0일 경우에는 현재 손가락의 위치로부터 거리를 계산합니다. 각 좌표값 차이의 절댓값을 더하게되면 직선경로가 아닌 x축,y축간의 이동경로를 구할 수 있으므로 해당 값을 비교하여 거리를 판단합니다.

📜 후기

너무도 당연하게 피타고라스 공식을 활용한 식을 짰다가, 직선거리에 대한 반례를 발견하여 식을 변경했습니다.

profile
머무르지 않기!

0개의 댓글