Free Lines Arrow
본문 바로가기
Algorithm/프로그래머스 알고리즘

[프로그래머스] 키패드 누르기

by skahn1215 2021. 7. 22.
728x90
반응형

문제

 

 

 

 

분석

내가 중요하게 생각한 분석은 다음과 같다.

  • 1. 거리를 구한다.
     -  처음에는 BFS 를 써야 되나 싶었는데, 직사각형이니 거리 구하는 공식으로 거리를 구했다.
     - 점 0,0 에서 다른점 1,1 의 거리를 구하려면
     - |x1 - dx1| + |y1 -dy1|  간단하다.
  • 2. 손가락 위치를 갱신한다.
    - 어떤 손가락을로 눌렀는지 따라 해당 손가락 위치를 업데이트 해준다.

 

 

 

 

구현

- C++ 로도 구현을 하려 했으나 음.... 크게 차이가 없어서 java로 만 했다.

class Solution {
 
    private int mDRightX = 0;
    private int mDRightY = 0;
    
    private int mDLeftX = 0;
    private int mDLeftY = 0;
  
    private int mTargetX = 0;
    private int mTargetY = 0;
  
    private int [][] keyPad = { {3,1}, //0
                                {0,0}, //1
                                {0,1}, //2
                                {0,2}, //3
                                {1,0}, //4
                                {1,1}, //5
                                {1,2}, //6
                                {2,0}, //7
                                {2,1}, //8
                                {2,2}, //9
                               };
        
    public int getLength(int x, int y, int dx, int dy) {
        int length = Math.abs((x-dx)) + Math.abs((y-dy));
        return length;
    }
    
    public String solve(int number, String hand) {
        int leftHandCount = getLength(keyPad[number][0], keyPad[number][1], mDLeftX, mDLeftY);
        int righthandCount = getLength(keyPad[number][0], keyPad[number][1], mDRightX, mDRightY);
        
        
        boolean isLeft = false;
        
        if(number ==1 || number == 4 || number ==7) {
            isLeft = true;
        } else if(number == 3 || number == 6 || number == 9) {
            isLeft = false;
        } else {
            if (leftHandCount < righthandCount) {
                isLeft = true;
            } else if(leftHandCount > righthandCount) {
                isLeft = false;
            } else {
                if(hand.equals("right")) {
                    isLeft = false;
                } else {   
                    isLeft = true;
                }
            }
        }
        
        String ret = "";
        if(isLeft) {
            ret = "L";
            mDLeftX = keyPad[number][0];
            mDLeftY = keyPad[number][1];
        } else {
            mDRightX = keyPad[number][0];
            mDRightY = keyPad[number][1];    
            ret = "R";
        }
        
        
        return ret;
    }
    
    public String solution(int[] numbers, String hand) {
        String answer = "";
        
        mDLeftX = 3;
        mDLeftY = 0;
        
        mDRightX = 3;
        mDRightY = 2;
        
        for(int i = 0; i < numbers.length; i++) 
        {
            answer += solve(numbers[i], hand);
        }
        
        return answer;
    }
}

 

 

 

결과

 

 

 

 

문제링크: https://programmers.co.kr/learn/courses/30/lessons/67256?language=java 

 

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

[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

 

728x90
반응형

댓글