개발 공부 기록
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

오늘 푼 문제중에 가장 복잡한 문제. 그래도 쉬웠다.

각 키패드 별로 해당하는 좌표를 맵으로 저장해 풀었다. 이차원 배열로 그냥 풀수도 있었을까, 싶긴 한데 숫자를 통해 좌표를 알아야 하기 때문에 나는 이 방식이 편했다. *과 #은 임의로 10, 11번으로 가정해 풀었다. (맵에 넣을 좌표가 필요했기 때문에)

 

가운데 있는 2, 5, 8, 0 키패드를 어느쪽 손가락으로 누를지 처리할 때는 현재에서 가야하는 곳까지의 |x좌표의 차이|+|y좌표의 차이| 로 계산하여 더 적은 쪽을 선택했다. 

import java.awt.*;
import java.util.HashMap;
import java.util.Map;

public class keypad {
    public static String solution(int[] numbers, String hand) {
        String answer = "";

        int curL, curR;
        Map<Integer, Point> keypad = new HashMap<>();

        int num = 1;
        for(int i = 0; i < 3; i++) {
            for(int j = 0; j < 3; j ++) {
                keypad.put(num ++, new Point(i, j));
            }
        }

        keypad.put(num, new Point(3, 0));
        keypad.put(num + 1, new Point(3, 2));
        keypad.put(0, new Point(3, 1));

        curL = 10;
        curR = 11;

        for(int i = 0; i < numbers.length; i ++) {
            int n = numbers[i];
            if(n == 1 || n == 4 || n == 7) {
                curL = n;
                answer += "L";
            }
            else if(n == 3 || n == 6 || n == 9) {
                curR = n;
                answer += "R";
            }
            else {
                Point LP = keypad.get(curL);
                Point RP = keypad.get(curR);
                Point NP = keypad.get(n);

                int LD = Math.abs(LP.x - NP.x) + Math.abs(LP.y - NP.y);
                int RD = Math.abs(RP.x - NP.x) + Math.abs(RP.y - NP.y);

                if(LD > RD) {
                    curR = n;
                    answer += "R";
                }
                else if(LD < RD) {
                    curL = n;
                    answer += "L";
                }
                else {
                    if(hand.equals("right")) {
                        curR = n;
                        answer += "R";
                    }
                    else {
                        curL = n;
                        answer += "L";
                    }
                }
            }
        }


        return answer;
    }

    public static void main(String[] args) {
        int[] numbers = {7, 0, 8, 2, 8, 3, 1, 5, 7, 6, 2};
        String hand = "left";

        System.out.println(solution(numbers, hand));
    }

}

 

 

728x90
profile

개발 공부 기록

@찐만두

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!