코테/프로그래머스

[프로그래머스/Lv. 1] 키패드 누르기

imname1am 2023. 4. 9. 21:21
반응형

🔺 문제

 

프로그래머스

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

programmers.co.kr

 

🔺 코드

 

[프로그래머스] 키패드 누르기 - Java, 자바

레벨 1https://programmers.co.kr/learn/courses/30/lessons/67256현재 왼손과 오른손의 위치를 키패드를 누를 때 마다 기억하고 있어야하는 부분을 구현하기 까다로운 문제였다. 키패드 위아래로 3차이, 양옆으

velog.io

class Solution {
    public String solution(int[] numbers, String hand) {
        String answer = "";
        
        int left  = 10;
        int right = 12;
        
        for(int tmp : numbers) {
            if(tmp == 1 || tmp == 4 || tmp == 7) {
                answer += "L";
                left = tmp;
            } else if(tmp == 3 || tmp == 6 || tmp == 9) {
                answer += "R";
                right = tmp;
            } else {    // 2 5 8 0
                if(tmp == 0) tmp = 11;
                int leftD = Math.abs(tmp - left) / 3 + Math.abs(tmp - left) % 3;
                int rightD = Math.abs(tmp - right) / 3 + Math.abs(tmp - right) % 3;
                
                if(leftD < rightD) {
                    answer += "L";
                    left = tmp;
                } else if(leftD > rightD) {
                    answer += "R";
                    right = tmp;
                } else {
                    if(hand.equals("left")) {
                        answer += "L";
                        left = tmp;
                    } else {
                        answer += "R";
                        right = tmp;
                    }
                }
            }
        }
 
        return answer;
    }
}
✅ 해결 아이디어
- 각 핸드폰 번호 사이의 거리를 좌표를 기준으로 생각

 

 


🔺 다른 풀이들

- 풀이1)

 

프로그래머스[Java] - 키패드 누르기(2020 카카오 인턴십)

programmers.co.kr/learn/courses/30/lessons/67256 코딩테스트 연습 - 키패드 누르기 [1, 3, 4, 5, 8, 2, 1, 4, 5, 9, 5] "right" "LRLLLRLLRRL" [7, 0, 8, 2, 8, 3, 1, 5, 7, 6, 2] "left" "LRLLRRLLLRR" [1, 2, 3, 4, 5, 6, 7, 8, 9, 0] "right" "LLRLLRLLRL"

zzang9ha.tistory.com

 

 

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

문제 설명 스마트폰 전화 키패드의 각 칸에 다음과 같이 숫자들이 적혀 있습니다. 이 전화 키패드에서 왼손과 오른손의 엄지손가락만을 이용해서 숫자만을 입력하려고 합니다. 맨 처음 왼손 엄

kangsd.tistory.com

설명을 잘 해주셨다.... 굿!!!

 

 

- 풀이2) switch - case 사용

 

프로그래머스

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

programmers.co.kr

class Solution {
    int tempL = 10;
    int tempR = 12;
    String myhand;
    public String solution(int[] numbers, String hand) {
        myhand = ((hand.equals("right"))? "R": "L");
        String answer = "";
        for(int i=0 ; i< numbers.length ; i++) {
            switch(numbers[i]) {
                case 1: case 4: case 7:
                    answer += "L";
                    tempL = numbers[i];
                    break;
                case 3: case 6: case 9:
                    answer += "R";
                    tempR = numbers[i];
                    break;
                default:
                    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;
                    break;
            }
        }
        return answer;
    }

    private 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);
        System.out.println(tempNum + ": " + leftDistance + ", " + rightDistance);
        return ((leftDistance == rightDistance)? myhand: (leftDistance > rightDistance)? "R": "L");

    }
}

💬 느낀 점

저 /3, %3 규칙을 나는 파악하지 못 해서 해결하지 못했다..

이런 규칙이 얼른 눈에 잘 보이면 좋겠다!!

반응형