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

홈런볼·2023년 7월 8일
0

프로그래머스

목록 보기
10/36

문제링크

https://school.programmers.co.kr/learn/courses/30/lessons/67256

문제접근

키보드의 자판 위치는 고정값이기 때문에 미리 위치를 기억해 두고, 위치를 해시 처럼 꺼내쓰는 방식을 생각함.
위 로직을 구현할 방법으로 배열을 사용함

  1. 왼손, 오른손 위치를 저장할 변수를 10, 11로 초기화
  2. 미리 키보드 자판의 위치를 배열로 초기화 함
  3. 키패드 숫자 배열을 순회
  4. 키패드 숫자가 1,4,7 => 왼손 / 3,6,9 => 오른손
  5. 눌러야 할 숫자가 2,5,8,0 => 왼손 위치와 자판의 위치 사이의 거리를 구하고, 오른손 위치와 자판 위치 사이의 거리를 정수 값으로 구한다.
  6. 두 위치가 같은 경우에는 hand값을 이용하여 누를 위치를 정한다
  7. 문자열을 반환함

코드

import java.util.Stack;

class Solution {
    public String solution(int[] numbers, String hand) {
        StringBuilder answer = new StringBuilder();
        int[][] keyboard = {{0,3,1},{1,0,0},{2,0,1},{3,0,2},{4,1,0},{5,1,1},{6,1,2},{7,2,0},{8,2,1},{9,2,2},{10,3,0},{11,3,2}};

        int left_hand = 10; // *
        int right_hand = 11; // #
        for(int i=0;i<numbers.length;i++){
            int n = numbers[i];
            if(n == 1||n == 4||n == 7) {
                answer.append("L");
                left_hand = n;
            }
            else if(n == 3||n == 6||n == 9) {
                answer.append("R");
                right_hand = n;
            }
            else{
                int nX = keyboard[n][1];
                int nY = keyboard[n][2];
                int rX = keyboard[right_hand][1];
                int rY = keyboard[right_hand][2];
                int lX = keyboard[left_hand][1];
                int lY = keyboard[left_hand][2];

                double rDistance = Math.ceil(Math.sqrt((nX-rX)*(nX-rX) + (nY-rY)*(nY-rY)));
                double lDistance = Math.ceil(Math.sqrt((nX-lX)*(nX-lX) + (nY-lY)*(nY-lY)));

                if(rDistance > lDistance){
                    answer.append("L");
                    left_hand = n;
                }else if(rDistance < lDistance){
                    answer.append("R");
                    right_hand = n;
                }else{
                    String h = hand.equals("left") ? "L":"R";
                    if(h.equals("L")) left_hand = n;
                    else right_hand = n;
                    answer.append(h);
                }
            }
        }
        return answer.toString();
    }
}

정확성 테스트

후기

두 점 사이의 거리 공식을 이용해서 풀었던 문제이다. 다른사람들의 풀이를 봤을 땐 위치를 미리 선언하고, 위치 간 절대값을 이용해서 거리를 측정하는데 절대값으로 거리를 측정하는게 더 직관적으로 보였다.

0개의 댓글