[PROGRAMMERS] 키패드 누르기

11285 단어 programmersprogrammers

🙆‍♀️ 문제 보기

💡 풀이

public String solution(int[] numbers, String hand) {
        StringBuilder sb = new StringBuilder();
        int left = 10;
        int right = 12;
        
        for(int number : numbers){
            if(number == 1 || number == 4 || number == 7){
                sb.append("L");
                left = number;
            }else if(number == 3 || number == 6 || number == 9){
                sb.append("R");
                right = number;
            }else{
                int leftLength = getLength(left, number);
                int rightLength = getLength(right, number);
                
                if(leftLength > rightLength){
                    sb.append("R");
                    right = number;
                }else if(leftLength < rightLength){
                    sb.append("L");
                    left = number;
                }else{
                    if(hand.equals("left")){
                        sb.append("L");
                        left = number;
                    }else{
                        sb.append("R");
                        right = number;
                    }
                }
            }
        }
        return sb.toString();
    }
    
    public static int getLength(int index, int number){       
        index = (index == 0) ? 11 : index;
        number = (number == 0) ? 11 : number;
        
        int xIndex = (index - 1) / 3;
        int yIndex = (index - 1) % 3;
        int xNumber = number / 3;
        int yNumber = 1;
        
        return Math.abs(xIndex - xNumber) + Math.abs(yIndex - yNumber);
}

문제를 풀다가 막혀서 결국 다른 풀이를 참고했다😢

🚨 문제 이해

  • 키패드를 좌표로 생각한다.
    👉 (0, 0), (0, 1) (0, 2) 등
  • number와 left 혹은 right의 x와 y끼리 뺀 다음 더하면 거리이다.
    👉 (x - x1) + (y - y1) = 거리
  • 왼쪽, 오른쪽 좌표값 규칙
    • x좌표 : (숫자-1) / 3
    • y좌표 : (숫자-1) % 3
  • 중앙 좌표값 규칙
    • x좌표 : number / 3
    • y좌표 : 1
  • 어떤 값이 더 큰지 알 수 없으므로 절대값으로 계산한다.

💡 풀이 설명

  • 거리를 계산하기 쉽도록 *, 0, #을 각각 10, 11, 12로 치환한다.
  • numbers 배열의 요소를 하나씩 꺼내서 1,4,7 / 3,6,9면 각각 sb에 "L" 혹은 "R"을 추가해주고 위치도 현재 위치로 바꿔준다.
  • 만약 2, 5, 8, 0이라면 각각 거리를 구해서 더 가까운 쪽을 sb에 추가하고 만약 거리가 같다면 hand로 결정한 다음 현재 위치를 저장한다.

좋은 웹페이지 즐겨찾기