본문 바로가기
카테고리 없음

프로그래머스 - Lv.1 키패드 누르기 자바

by 윤뇽뇽

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

1. SOLUTION

특별한 알고리즘 없이 쌩구현 하면 되는 문제인데 눌러야 하는 번호가 2, 5, 8, 0일 경우가 조금 까다로웠다.

입력해야하는 번호와 현재 왼손&오른손의 거리를 구해 주어야 하는데, 이 거리 구하는 방법을 생각하는게 쉽지 않았다.

좌우로 움직여야 하는 거리 + 위아래로 움직여야 하는 거리를 계산해 주면 된다.

* 숫자 % 3이 1이라면 키패드에서 왼쪽 줄(1, 4, 7, 10), 2라면 가운데 줄(2, 5, 8, 11), 0이라면 오른쪽 줄(3, 6, 9, 12)

눌러야하는 번호와의 거리 = ((현재 번호 - 눌러야 하는 번호) % 3) + ((현재 번호 - 눌러야 하는 번호) / 3)

해당 식을 사용해서 왼손과 오른손의 거리를 구해준 후 문제에서 요구하는 사항대로 구현해주면 된다.

import java.util.*;

class Solution {
    public String solution(int[] numbers, String hand) {
        String answer = "";
        // 왼쪽&오른쪽 손가락 첫 위치 설정
        int left = 10;
        int right = 12;
        // numbers 돌아보면서 answer에 사용한 손가락 기록해주기
        for(int now: numbers) {
            // 누른 번호가 1, 4, 7일 경우 왼손 사용
            if(now == 1 || now == 4 || now == 7){
                answer += "L";
                left = now;
            // 누른 번호가 3, 6, 9일 경우 오른손 사용    
            } else if (now == 3 || now == 6 || now == 9){
                answer += "R";
                right = now;
            }

먼저 왼손, 오른손의 첫 위치를 *(10), #(12)로 설정해 주고,

번호가 (1, 4, 7)일 때에는 왼손으로, (3, 6, 9)일 때는 오른손으로 눌러준다. 

            // 누른 번호가 2, 5, 8, 0일 경우 왼손과 오른손 중 번호에 더 가까운 손 사용
            } else {
                // 0은 11로 바꿔서 생각해주기
                if (now == 0) now = 11;
                // 현재 번호와 왼손, 오른손의 거리 구하기(좌우 거리 + 위아래 거리)
                int left_d = Math.abs(now - left) % 3 + Math.abs(now - left) / 3;
                int right_d = Math.abs(now - right) % 3 + Math.abs(now - right) / 3;
                // 왼손 거리가 더 가까울 경우 왼손 사용
                if (left_d < right_d) {
                    answer += "L";
                    left = now;
                // 오른손 거리가 더 가까울 경우 오른손 사용
                } else if (left_d > right_d) {
                    answer += "R";
                    right = now;
                // 두 손 모두 거리가 같다면
                } else {
                    // 왼손잡이는 왼손 사용
                    if (hand.equals("left")) {
                        answer += "L";
                        left = now;
                    // 오른손잡이는 오른손 사용
                    } else {
                        answer += "R";
                        right = now;
                    }
                }
            }

번호가 (2, 5, 8, 0)일 경우 해당 번호와 왼손&오른손의 거리를 구한 후 더 가까운 손을 사용해준다.

만약 두 손의 거리가 같다면 왼손잡이는 왼손, 오른손잡이는 오른손을 사용해주는 것으로 구현하면 된다.

2. CODE

import java.util.*;

class Solution {
    public String solution(int[] numbers, String hand) {
        String answer = "";
        // 왼쪽&오른쪽 손가락 첫 위치 설정
        int left = 10;
        int right = 12;
        // numbers 돌아보면서 answer에 사용한 손가락 기록해주기
        for(int now: numbers) {
            // 누른 번호가 1, 4, 7일 경우 왼손 사용
            if(now == 1 || now == 4 || now == 7){
                answer += "L";
                left = now;
            // 누른 번호가 3, 6, 9일 경우 오른손 사용    
            } else if (now == 3 || now == 6 || now == 9){
                answer += "R";
                right = now;
            // 누른 번호가 2, 5, 8, 0일 경우 왼손과 오른손 중 번호에 더 가까운 손 사용
            } else {
                // 0은 11로 바꿔서 생각해주기
                if (now == 0) now = 11;
                // 현재 번호와 왼손, 오른손의 거리 구하기(좌우 거리 + 위아래 거리)
                int left_d = Math.abs(now - left) % 3 + Math.abs(now - left) / 3;
                int right_d = Math.abs(now - right) % 3 + Math.abs(now - right) / 3;
                // 왼손 거리가 더 가까울 경우 왼손 사용
                if (left_d < right_d) {
                    answer += "L";
                    left = now;
                // 오른손 거리가 더 가까울 경우 오른손 사용
                } else if (left_d > right_d) {
                    answer += "R";
                    right = now;
                // 두 손 모두 거리가 같다면
                } else {
                    // 왼손잡이는 왼손 사용
                    if (hand.equals("left")) {
                        answer += "L";
                        left = now;
                    // 오른손잡이는 오른손 사용
                    } else {
                        answer += "R";
                        right = now;
                    }
                }
            }
        }
        return answer;
    }
}

 

댓글