플밍/문제풀이

[프로그래머스, Java] 카카오 인턴 - 키패드 누르기

kkap999 2022. 2. 8. 16:01
728x90

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

 

상세한 문제 설명은 링크 참조

 

<풀이>

손가락의 처음 위치는 */#

147(왼쪽)은 무조건 왼손

369(오른쪽)은 무조건 오른손

2580(가운데)는 가까운 손으로 친다.

 

0만 없었으면 다른 자료구조가 필요 없이 그냥 int변수만으로 끝낼 수 있을 것 같은데, *0#때문에 처리가 조금 귀찮아서

차라리 직관적이고 깔끔하게 좌표를 저장하기로 했다.

좌표 저장은 배열이나 클래스를 사용할 수 있는데, 나는 클래스로 선언

 

*과#은 맨 처음을 제외하고는 누르지 않기 때문에, 0을 제외하고 생각한다면 키패드는

1 2 3

4 5 6

7 8 9

이다.

3*3 크기의 테이블에 순서대로 숫자가 저장되어 있기 때문에 규칙성을 발견할 수 있음.

행 : 1빼서 3으로 나눴을 때 몫이 행의 인덱스와 같음

열 : 2더하고 3으로 나눴을 때 나머지가 열의 인덱스와 같음

다만 0의 경우는 예외적인 상황이기때문에 따로 처리해주었다.

 

이를 이용해서 숫자의 좌표를 간결하게 저장할 수 있다.

Point p;
if(numbers[i] == 0)
	p = new Point(1, 3);
else
	p = new Point((numbers[i]+2)%3, (numbers[i]-1)/3);

 

이것을 저장되어있는 손가락의 좌표와 비교하면서 거리만 계산해주면 된다.

다만 전체 소스코드에서 코드가 반복되는부분이 나오는데, 이걸 처리하고싶었는데 처리할 방법을 생각하지 못했다.

좋은 아이디어가 있다면 댓글로 알려주세요!

 

<전체 소스코드>

class Solution {
    public String solution(int[] numbers, String hand) {
        String answer = "";
        
        Point currL = new Point(0, 3);
        Point currR = new Point(2, 3);
        
        for(int i = 0; i < numbers.length; i++){
            Point p;
            if(numbers[i] == 0)
                p = new Point(1, 3);
            else
                p = new Point((numbers[i]+2)%3, (numbers[i]-1)/3);
            
            if(p.x == 0){
                answer += "L";
                currL = p;
            } else if (p.x == 2){
                answer += "R";
                currR = p;
            } else {
              // 2 5 8 0인 경우   
                int ld = Math.abs(currL.x - p.x) + Math.abs(currL.y - p.y);
                int rd = Math.abs(currR.x - p.x) + Math.abs(currR.y - p.y);
                
                if(ld < rd || (ld == rd && hand.equals("left"))){
                    // 왼손이 가까운 경우 왼손을 이동
                    currL = p;
                    answer += "L";
                } else if(ld > rd || (ld == rd && hand.equals("right"))){
                    currR = p;
                    answer += "R";
                }
            }
        }
        
        return answer;
    }
}

class Point{
    int x, y;
    Point(int x, int y){
        this.x = x;
        this.y = y;
    }
}

'플밍 > 문제풀이' 카테고리의 다른 글

[Java] BOJ16973, 백준 - 직사각형 탈출  (0) 2022.02.09
[SWEA, Java] 괄호 짝짓기  (0) 2022.02.08
[Java] BOJ2573, 백준 - 빙산  (0) 2022.02.08
[Java] BOJ17141, 백준 - 연구소2  (0) 2022.02.08
[Java] BOJ2493, 백준 - 탑  (0) 2022.02.08