멍두의 개발새발

[프로그래머스] - 키패드 누르기 in Java 본문

카테고리 없음

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

멍두 2024. 6. 28. 02:48
반응형

📍 문제

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

 

프로그래머스

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

programmers.co.kr

 

 

📍 문제설명

문제 종류 : 구현

 

1. 전화번호를 좌표로 처리한다.

2. numbes 배열을 돌면서 매번 검색하므로 빠른 검색을 위해 map을 사용한다

3. 초기 오른손 좌표와 왼손 좌표를 설정한다

4, 1,4,7은 왼손 / 3,6,9는 오른손이 이동한다

5. 2,,5,8,0은 가까운 손이 이동한다 

6. 거리 계산은 현재 좌표에서 목표 좌표까지의 ,x y 좌표 차이를 계산하여 더한다 | rx - cx |  + | ry - cy |

 

📍 코드

✔️ 코드

더보기
더보기

 

import java.util.*;

class Solution {
    public String solution(int[] numbers, String hand) {
        StringBuilder sb = new StringBuilder();
        
        Map<Integer, int[]> map = new HashMap<>();
        map.put(1, new int[]{0, 0});
        map.put(2, new int[]{1, 0});
        map.put(3, new int[]{2, 0});
        map.put(4, new int[]{0, 1});
        map.put(5, new int[]{1, 1});
        map.put(6, new int[]{2, 1});
        map.put(7, new int[]{0, 2});
        map.put(8, new int[]{1, 2});
        map.put(9, new int[]{2, 2});
        map.put(0, new int[]{1, 3});
        
        //1. 초기 상태
        int rx = 2;
        int ry = 3;
        
        int lx = 0;
        int ly = 3;
        for(int i = 0; i < numbers.length; i++){
            //2. 이동하려는 곳의 좌표값을 구함
            int[] current = map.get(numbers[i]);
            int cx = current[0];
            int cy = current[1];
            
            //3. 1,4,7 이면 왼손 / 3,6,9 면 오른손
            if(numbers[i] == 1 || numbers[i] == 4 || numbers[i] == 7){
                lx = cx;
                ly = cy;
                sb.append("L");
                continue;
            }
            if(numbers[i] == 3 || numbers[i] == 6 || numbers[i] == 9){
                rx = cx;
                ry = cy;
                sb.append("R");
                continue;
            }
            //4. 그 외의 경우
            //오른손 이동 거리, 왼손 이동 거리 계산
            int rightMove = Math.abs(rx - cx) + Math.abs(ry - cy);
            int leftMove = Math.abs(lx - cx) + Math.abs(ly - cy);
            
            //이동 거리가 더 짧은 손이 이동
            //만약 이동 거리가 같다면 hand에 따라 결정
            if(rightMove == leftMove){
                if(hand.equals("right")){
                    rx = cx;
                    ry = cy;
                    sb.append("R");
                }
                else{
                    lx = cx;
                    ly = cy;
                    sb.append("L");
                }
            }else if(rightMove > leftMove){
                lx = cx;
                ly = cy;
                sb.append("L");
            }else{
                rx = cx;
                ry = cy;
                sb.append("R");
            }     
        }
        
        return sb.toString();
    }
}

 

📍 틀린이유

rx, ry, cx, cy, lx, ly가 너무 자주 나오다 보니 오타가 있었고, 다 비슷하게 생기니 찾기가 힘들었다.

 

📍 기억할 것

중복이 많이 되는 부분인 rx, ry, lx, ly를 갱신하는 부분에서 변수를 전역변수로 선언 한 뒤 함수를 만들어 처리할까 싶기도 한데 전역변수는 쓰면 뭔가 마음이 불편..해서 잘 안하게 된다.

어떤게 가장 좋은 방법일지 ..

 

이런 코드에서는 변수명을 더 명확하게 짓기 / 디버깅 꼼꼼하게 자주해보기가 정답인 것 같다

 

반응형