코딩테스트

[프로그래머스/Java] 키패드 누르기

데메즈 2026. 7. 8. 22:06
반응형

https://school.programmers.co.kr/learn/courses/30/lessons/67256

 

프로그래머스

SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

 

내 풀이

class Solution {
    public String solution(int[] numbers, String hand) {
        String answer = "";
        int[] currentL = {3,0}, currentR = {3,2};
        int[][] keypad = {
            {3,1}, // 0
            {0,0}, // 1
            {0,1}, // 2
            {0,2}, // 3
            {1,0}, // 4
            {1,1}, // 5
            {1,2}, // 6
            {2,0}, // 7
            {2,1}, // 8
            {2,2} // 9
        };
        
        for(int i=0; i<numbers.length; i++){
            int num = numbers[i];
            int x = keypad[num][0];
            int y = keypad[num][1];
            
            if(keypad[num][1]==0){
                answer += 'L';
                currentL[0] = x;
                currentL[1] = y;
            } else if(keypad[num][1]==2){
                answer += 'R';
                currentR[0] = x;
                currentR[1] = y;
            } else {
                int disL = Math.abs(currentL[0]-x)+Math.abs(currentL[1]-y);
                int disR = Math.abs(currentR[0]-x)+Math.abs(currentR[1]-y);
                if(disL < disR){
                    answer += 'L';
                    currentL[0] = x;
                    currentL[1] = y;
                } else if(disL > disR){
                    answer += 'R';
                    currentR[0] = x;
                    currentR[1] = y;
                } else if(disL == disR && hand.equals("left")){
                    answer += 'L';
                    currentL[0] = x;
                    currentL[1] = y;
                } else if(disL == disR && hand.equals("right")){
                    answer += 'R';
                    currentR[0] = x;
                    currentR[1] = y;
                }
            }
        }
        return answer;
    }
    
}

 

제미나이가 리팩토링한 풀이

class Solution {
    public String solution(int[] numbers, String hand) {
        // 문자열을 효율적으로 이어 붙이기 위한 StringBuilder 사용
        StringBuilder answer = new StringBuilder();
        
        // 1차원 배열로 현재 왼손, 오른손 좌표 관리
        int[] leftPos = {3, 0}; 
        int[] rightPos = {3, 2};
        
        // 키패드 좌표 배열
        int[][] keypad = {
            {3, 1}, {0, 0}, {0, 1}, {0, 2}, {1, 0}, 
            {1, 1}, {1, 2}, {2, 0}, {2, 1}, {2, 2}
        };
        
        for (int num : numbers) {
            int x = keypad[num][0];
            int y = keypad[num][1];
            
            if (y == 0) {
                answer.append("L");
                leftPos[0] = x; leftPos[1] = y;
            } else if (y == 2) {
                answer.append("R");
                rightPos[0] = x; rightPos[1] = y;
            } else {
                // 가운데 라인은 거리를 먼저 계산
                int disL = Math.abs(leftPos[0] - x) + Math.abs(leftPos[1] - y);
                int disR = Math.abs(rightPos[0] - x) + Math.abs(rightPos[1] - y);
                
                // 어느 손을 움직일지 '결정'만 먼저 내리기
                boolean moveLeft = false;
                
                if (disL < disR) {
                    moveLeft = true;
                } else if (disL > disR) {
                    moveLeft = false;
                } else {
                    // 거리가 같을 때는 주 주손잡이 기준
                    moveLeft = hand.equals("left");
                }
                
                // 결정된 손에 따라 최종적으로 1번만 값 갱신 (중복 코드 제거)
                if (moveLeft) {
                    answer.append("L");
                    leftPos[0] = x; leftPos[1] = y;
                } else {
                    answer.append("R");
                    rightPos[0] = x; rightPos[1] = y;
                }
            }
        }
        
        return answer.toString();
    }
}
반응형