프로그래머스 키패드 누르기 자바

바그다드·2023년 9월 22일
0

문제

풀이

import java.util.*;

class Solution {
    public String solution(int[] numbers, String hand) {
        String answer = "";
        // 왼쪽 엄지손가락, 오른쪽 엄지손가락 위치 초기화
        Pos lp = new Pos(4,1);
        Pos rp = new Pos(4,3);

        // 각 번호의 위치 초기화
        Map<Integer, Pos> map = new HashMap<>();
        map.put(1, new Pos(1,1));
        map.put(2, new Pos(1,2));
        map.put(3, new Pos(1,3));
        map.put(4, new Pos(2,1));
        map.put(5, new Pos(2,2));
        map.put(6, new Pos(2,3));
        map.put(7, new Pos(3,1));
        map.put(8, new Pos(3,2));
        map.put(9, new Pos(3,3));
        map.put(0, new Pos(4,2));

        // 번호 누르기 시작
        for(int i = 0; i < numbers.length; i++){
            // 번호가 1,4,7일때는 왼손으로 누르기
            if(numbers[i] == 1 || numbers[i] == 4 || numbers[i] == 7){
                answer += "L";
                lp = map.get(numbers[i]);
            // 번호가 3,6,9일때는 오른손으로 누르기
            }else if(numbers[i] == 3 || numbers[i] == 6 || numbers[i] == 9){
                answer += "R";
                rp = map.get(numbers[i]);
            // 번호가 2,5,8,0일때
            }else{
                // 현재 번호의 위치 가져오기
                Pos now = map.get(numbers[i]);

                // 왼손의 위치와 현재 위치의 거리값 계산
                int tmpl = (Math.max(lp.x, now.x) - Math.min(lp.x, now.x)) +
                        (Math.max(lp.y, now.y) - Math.min(lp.y, now.y));
                // 오른손의 위치와 현재 위치의 거리값 계산
                int tmpr = (Math.max(rp.x, now.x) - Math.min(rp.x, now.x)) +
                        (Math.max(rp.y, now.y) - Math.min(rp.y, now.y));

                // 왼손이 더 가까울 때
                if(tmpl < tmpr){
                    answer += "L";
                    lp = now;
                // 오른손이 더 가까울 때
                }else if(tmpl > tmpr){
                    answer += "R";
                    rp = now;
                // 거리가 같을 때
                }else{
                    if(hand.equals("left")){
                        answer += "L";
                        lp = now;
                    }else{
                        answer += "R";
                        rp = now;
                    }
                }
            }

        }
        return answer;
    }
}

// 번호의 위치를 저장하기 위한 클래스
class Pos{
    int x;
    int y;
    public Pos(int x, int y){
        this.x = x;
        this.y = y;
    }
}

리뷰

처음에는 모든 경우의 수를 if문을 통해 구현하려고 하였다.
하지만 그럴 경우 고려해야할 경우의 수가 너무 많았다.
그래서 그 다음에는 단순히 왼손이 위치한 번호와 오른손이 위치한 번호, 현재 번호의 숫자를 계산을 통해 처리해보려고 생각했는데, 그것도 식이 떠오르질 않아 패스했다.

그래서 떠올린 방법은 일단 맵을 이용해 각 번호와 키패드의 좌표를 저장하고,
왼손이 위치한 번호의 좌표, 오른손의 좌표, 현재 번호의 좌표를 각각 계산해 거리가 가까운 손으로 누르는 방식으로 문제를 해결하였다.

위의 코드와 주석을 보는게 이해가 더 빠를 것 같다.

요새 뭔가 map을 자주 쓰게 되는거 같다.

profile
꾸준히 하자!

0개의 댓글