티스토리 뷰

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

프로그래머스 67256번 - https://programmers.co.kr/learn/courses/30/lessons/67256
프로그래머스 67256번 - https://programmers.co.kr/learn/courses/30/lessons/67256

 

요구사항

1. 키패드의 1, 4, 7 숫자를 입력할 때는 왼손 엄지손가락을 사용한다.

2. 키패드의 3, 6, 9 숫자를 입력할 때는 오른손 엄지손가락을 사용한다.

3 - 1. 키패드의 2, 5, 8, 0을 입력할 때는 두 엄지손가락의 현재 키패드의 위치에서 더 가까운 엄지손가락을 사용한다.

3 - 2. 만약 거리가 같다면 오른손잡이는 오른손 엄지손가락, 왼손잡이는 왼손 엄지손가락을 사용한다.

4. 거리는 키패드 이동 한 칸이 1이다.

 

요구사항 분석 및  풀이과정

키패드 1을 원점으로 기준으로 하여 오른쪽과 아래쪽을 양의 방향으로 하여 각 숫자를 좌표의 형식으로 변환한다.

변환을 쉽게 하기 위하여 0을 제외한 키패드의 모든 숫자에서 1을 뺀 후, 3을 나누어 몫을 행, 나머지를 열로 취한다.

(*은 10, 0은 11, #은 12로 보고 변환을 하면 된다.)

 

키패드 숫자의 (행, 열) = ((숫자 - 1) / 3, (숫자 - 1) % 3)

3으로 나누는 이유는 키패드 한 줄에 3개의 숫자가 있기 때문이다.

 

 

키패드의 숫자의 위치를 행과 열로 구분하는 과정

 

그러면 키패드 1은 (0, 0), 키패드 9는 (2, 2)로 변환이 될 수 있다.

 

1. 눌러야 되는 숫자의 열이 0이면 왼쪽 엄지손가락의 위치를 해당 키패드의 행과 열로 옮겨주고, "L"을 출력

2. 눌러야 되는 숫자의 열이 2이면 오른쪽 엄지손가락의 위치를 해당 키패드의 행과 열로 옮겨주고, "R"을 출력

3. 눌러야 되는 숫자의 열이 1이라면 두 엄지손가락 중 해당 키패드와 가까운 엄지손가락의 위치를 해당 키패드의 행과 열로 옮겨주고 옮긴 엄지손가락의 정보("L" 또는 "R")를 출력

3-2. 만약 거리가 동일하다면 오른손잡이는 오른쪽 엄지손가락, 왼손잡이는 왼쪽 엄지손가락을 해당 키패드의 행과 열로 옮겨주고 옮긴 엄지손가락의 정보("L" 또는 "R")를 출력

 

왼쪽 엄지손가락은 "*"에서 시작하므로 행과 열로 표현하면 (3, 0)에 위치하고, 오른쪽 엄지손가락은 "#"에서 시작하므로 행과 열로 표현하면 (3, 2)에서 시작한다.

 

소스코드 작성

class Solution {
    
    private static class Position {
    
        private int x;
        private int y;
        
        public Position(int x, int y) {
            this.x = x;
            this.y = y;
        }
        
        public void move(int x, int y) {
            this.x = x;
            this.y = y;
        }
        
        public int distance(Position other) {
            return Math.abs(other.x - this.x) + Math.abs(other.y - this.y);
        }
    }
    
    public String solution(int[] numbers, String hand) {
        Position leftHand = new Position(3, 0), rightHand = new Position(3, 2);
        StringBuilder result = new StringBuilder(numbers.length);
        
        for(int number : numbers) {
            int pos = number == 0 ? 11 - 1 : number - 1;
            int row = pos / 3, col = pos % 3;
            Position target = new Position(row, col);
            
            if (col == 0) {
                leftHand.move(row, col);
                result.append("L");
            } else if (col == 2) {
                rightHand.move(row, col);
                result.append("R");
            } else if (target.distance(leftHand) < target.distance(rightHand)) {
                leftHand.move(row, col);
                result.append("L");
            } else if (target.distance(leftHand) > target.distance(rightHand)) {
                rightHand.move(row, col);
                result.append("R");
            } else if ("right".equals(hand)) {
                rightHand.move(row, col);
                result.append("R");
            } else {
                leftHand.move(row, col);
                result.append("L");
            }
        }
        
        return result.toString();
    }
}

 

결과

 

소스코드 깃허브 주소

링크

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/04   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
글 보관함