본문 바로가기
알고리즘/PROGRAMMERS

키패드 누르기(Lv.1)

by 현대타운301 2024. 3. 21.

 


 

문제 설명

 

 

 

입출력 예시

 

 

요약

1,4,7은 왼손 3,6,9는 오른손 나머지는 가까운 손이 누른다.

 


 

풀이

 

문제 해석

좌표로 생각하고 오른쪽 왼쪽 이동한 칸 수 계산하기

 

 

접근 방식

1. 각 번호를 row와 col 형식의 좌표로 구성

  → 1번: (0, 0), 2번: (0, 1), ... , 0번: (3, 1)

 

2. 왼손 오른손의 시작위치 설정

  → 왼손: (3, 0), 오른손(3, 2)

 

3. 1,4,7은 왼손 3,6,9는 오른손 나머진 가까운 손

  → 누를 번호와 각 손의 위치를 계산해서 가까운 위치를 해당 번호 좌표로 변경

 


 

코드리뷰

 

import java.util.*;

class Solution {
    class HandPosition {	// 손의 위치를 담을 객체 클래스 정의
        int row;
        int col;
        public HandPosition(int row, int col) {
            this.row = row;
            this.col = col;
        }
    }
    
    public String solution(int[] numbers, String hand) {
        String answer = "";
        HashMap<Integer, String> keypad = new HashMap<>();
        HandPosition left = new HandPosition(3, 0);	// 왼손 초기화
        HandPosition right = new HandPosition(3, 2);	// 오른손 초기화
        for(int i = 0; i < 10; i++) {
            if(i == 0) {
                keypad.put(i, "3 1");	// 0번의 경우 직접 세팅
            } else {
                String num1 = String.valueOf((i-1) / 3);	// 각 번호의 row 좌표
                String num2 = String.valueOf((i-1) % 3);	// 각 번호의 col 좌표
                keypad.put(i, (num1 + " " + num2));		// ex) 1번의 경우 "0 0"과 같이 담김
            }
        }
        for(int i : numbers) {
            int keyRow = Integer.valueOf(keypad.get(i).split(" ")[0]);
            int keyCol = Integer.valueOf(keypad.get(i).split(" ")[1]);
            int distL = Math.abs(left.row - keyRow) + Math.abs(left.col - keyCol);	// 왼손과 거리계산
            int distR = Math.abs(right.row - keyRow) + Math.abs(right.col - keyCol);	// 오른손과 거리계산
            if(i == 1 || i == 4 || i == 7) {	// 147번은 왼손
                answer += "L";
                left.row = keyRow;
                left.col = keyCol;
            } else if(i == 3 || i == 6 || i == 9) {	// 369번은 오른손
                answer += "R";
                right.row = keyRow;
                right.col = keyCol;
            } else {	// 나머지는 거리계산
                if(distL > distR) {
                    answer += "R";
                    right.row = keyRow;
                    right.col = keyCol;
                } else if(distL < distR) {
                    answer += "L";
                    left.row = keyRow;
                    left.col = keyCol;
                } else {	// 같다면 주손으로 설정
                    if(hand.equals("left")) {
                        answer += "L";
                        left.row = keyRow;
                        left.col = keyCol;
                    } else {
                        answer += "R";
                        right.row = keyRow;
                        right.col = keyCol;
                    }
                }    
            }
        }
        return answer;
    }
}

 

 

 

'알고리즘 > PROGRAMMERS' 카테고리의 다른 글

소수 찾기(Lv.2)  (0) 2024.03.21
크레인 인형뽑기 게임(Lv.1)  (0) 2024.03.21
성격 유형 검사하기(Lv.1)  (0) 2024.03.21
신규 아이디 추천(Lv.1)  (0) 2024.03.21
메뉴 리뉴얼(Lv.2)  (2) 2024.03.19