코딩 테스트

프로그래머스) 키패드 누르기 Lv1

우루쾅 2024. 2. 7. 09:53
728x90
반응형
SMALL

역시 카카오

래벨 1 문제도 호락호락하지 않다

 

스마트폰의 각각 키패드 왼손과 오른손 번호를 모두 L과 R로 셋팅을 했다.

그리고 맨 처음 숫자를 클릭할 때 오른손과 왼속을 셋팅까지 했다.

import java.util.*;

class Solution {
    public String solution(int[] numbers, String hand) {
        String answer = "";
        // 현재 숫자를 담을 변수
        int cur = 0;
        // 각 숫자간의 거리 정하기
        Map<String, Integer> checkNo = new HashMap<>();
        
        for(int i=0; i<numbers.length; i++){
            if(numbers[i] == 1 || numbers[i] == 4 || numbers[i] == 7){
                // 왼쪽 정리
                answer += "L";
                checkNo.put("L", numbers[i]);
                cur = numbers[i];
            }else if(numbers[i] == 3 || numbers[i] == 6 || numbers[i] == 9){
                // 오른쪽 정리
                answer += "R";
                checkNo.put("R", numbers[i]);
                cur = numbers[i];
            }else if(numbers[i] == 2 || numbers[i] == 5 || numbers[i] == 8 || numbers[i] == 0){
                // 가운데 숫자 정하기
                if(i == 0){
                    if(hand.equals("right")){
                        answer += "R";
                        checkNo.put("R", numbers[i]);   
                    } else {
                        answer += "L";
                        checkNo.put("L", numbers[i]);   
                    }
                }
                
                cur = numbers[i];
            }
        }
        
        return answer;
    }
}

 

그런데 이 이후 어떻게 해야될지 생각이 안나서 힌트(질문하기)를 사용...!

 

이것저것 보니 이 문제는 쉽게 풀 문제가 아니였다

 

시간이 너무 많이 갈 것 같아서 정답보기를 통해 문제를 풀었다

 

 

대부분 거리에 대한 절대값을 가지고 손가락의 위치에 따라 가까운 값을 찾아서 값을 구했다

 

이 문제는 내가 풀었다고 볼 수 없으므로....

나중에 다시 풀어봐야겠다


정답

import java.util.*;

// 이건 나중에 다시 풀어보기
class Solution {
    int tempL = 10;
    int tempR = 12;
    String myhand;
    
    public String solution(int[] numbers, String hand) {
        String answer = "";
        myhand = ((hand.equals("right"))? "R": "L");
        // 현재 숫자를 담을 변수
        int cur = 0;
        
        for(int i=0; i<numbers.length; i++){
            if(numbers[i] == 1 || numbers[i] == 4 || numbers[i] == 7){
                // 왼쪽 정리
                answer += "L";
                tempL = numbers[i];
            }else if(numbers[i] == 3 || numbers[i] == 6 || numbers[i] == 9){
                // 오른쪽 정리
                answer += "R";
                tempR = numbers[i];
            }else {
                String tempHand = checkHand(numbers[i]);
                if(tempHand.equals("R"))
                    tempR = numbers[i] + ((numbers[i] == 0)? 11:0);
                else tempL = numbers[i] + ((numbers[i] == 0)? 11:0);
                    answer += tempHand;
                
                cur = numbers[i];
            }
        }
        return answer;
    }
    
    public String checkHand(int tempNum) {
        int leftDistance = 0;
        int rightDistance = 0;
        if(tempNum == 0) tempNum = 11;

        leftDistance = Math.abs((tempNum-1)/3 - (tempL-1)/3) + Math.abs((tempNum-1)%3 - (tempL-1)%3);
        rightDistance = Math.abs((tempNum-1)/3 - (tempR-1)/3) + Math.abs((tempNum-1)%3 - (tempR-1)%3);
        return ((leftDistance == rightDistance)? myhand: (leftDistance > rightDistance)? "R": "L");
    }
}

 

 

 

출처

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

728x90
반응형
LIST