본문 바로가기

프로그래머스(Java)/Level 1

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

728x90

코드 힌트

  1. 초기 설정:
    • '*'와 '#'의 초기 위치를 설정합니다.
    • 이 위치는 leftPos와 rightPos 배열에 저장됩니다.
    • 초기 설정 후에는 이 위치들이 번호 입력에 따라 업데이트됩니다.
  2. 번호와 위치 매핑:
    • 각 번호와 그에 해당하는 위치를 저장해야 합니다.
    • 저는 이를 위해 번호를 키(key)로, 위치를 값(value)으로 하는 해시맵(HashMap)을 사용했습니다.
    • 해시맵말고도 2차원 배열을 사용하셔도 됩니다.
    • 이 맵은 번호를 입력하면 그 번호의 위치를 반환하는 용도로 사용됩니다.
  3. 손의 초기 설정:
    • 사용자가 오른손잡이인지 왼손잡이인지 설정합니다
    • 이 설정은 번호를 누를 때 손의 선택에 영향을 줍니다.
  4. 번호 입력 처리:
    • 주어진 번호 배열(numbers)을 순회하면서 각 번호를 누를 때마다 손의 선택을 결정합니다.
  5. 왼쪽 열의 번호:
    • 1, 4, 7은 항상 왼손(L)으로 선택됩니다.
    • 이 경우 leftPos를 해당 번호의 위치로 업데이트합니다.
  6. 오른쪽 열의 번호:
    • 3, 6, 9는 항상 오른손(R)으로 선택됩니다.
    • 이 경우 rightPos를 해당 번호의 위치로 업데이트합니다.
  7. 가운데 열의 번호:
    • 2, 5, 8, 0은 현재 손 위치와 거리를 계산하여 결정됩니다.
    • 왼손과 오른손 중 더 가까운 손을 선택합니다.
    • 거리가 같다면 사용자가 설정한 손잡이에 따라 선택됩니다.
    • 선택된 손의 위치를 해당 번호의 위치로 업데이트합니다.
  8. 결과 문자열 구성:
    • 각 번호에 대해 결정된 손(L 또는 R)을 문자열에 추가하여 최종 결과를 형성합니다.

 


정답은 더보기 클릭

더보기
import java.util.*;

class Solution {
    
    // 편하게 사용할려고 static을 사용했지만 원하시는 입맛으로 사용하세요
    // 초기 위치 설정: '*'와 '#'의 위치
    static int[] leftPos = {3,0};
    static int[] rightPos = {3,2};
    static boolean isRightHanded;
    static HashMap<Integer,int[]> numberPositions;
    
    public String solution(int[] numbers, String handedness) {
        StringBuilder result = new StringBuilder();
        
        // 번호의 위치를 설정하는 맵 생성
        numberPositions = generateNumberPositions();
        
        // 사용자가 오른손잡이인지 왼손잡이인지 설정
        isRightHanded = handedness.equals("right");
        
        // 각 번호에 대해 손 위치 결정
        for (int number : numbers) {
            int[] pos = numberPositions.get(number);
            
            // 번호를 누를 손 결정
            String hand = determineHand(pos);
            
            // 손 위치 업데이트
            if (hand.equals("R")) {
                rightPos = pos;
            } else {
                leftPos = pos;
            }
            
            // 결과 문자열에 손 추가
            result.append(hand);
        }
        
        return result.toString();
    }
    
    // 번호를 누를 손을 결정하는 메소드
    static String determineHand(int[] pos) {
        if (pos[1] == 0) return "L";  // 왼쪽 열의 번호 (1, 4, 7) 
        else if (pos[1] == 2) return "R";  // 오른쪽 열의 번호 (3, 6, 9)
        
        // 가운데 열의 번호 (2, 5, 8, 0)일 경우 거리 계산
        if (calculateDistance(pos)) return "R";
        else return "L";
    }
    
    // 현재 손의 위치와 번호 위치 간의 거리를 계산하는 메소드
    static boolean calculateDistance(int[] pos) {
        int leftDist = Math.abs(pos[0] - leftPos[0]) + Math.abs(pos[1] - leftPos[1]);
        int rightDist = Math.abs(pos[0] - rightPos[0]) + Math.abs(pos[1] - rightPos[1]);
        
        if (leftDist > rightDist) return true;
        else if (leftDist < rightDist) return false;
        
        return isRightHanded;
    }
    
    // 번호의 위치를 맵으로 생성하는 메소드
    static HashMap<Integer,int[]> generateNumberPositions() {
        int[][] numbersArray = {
            {1, 2, 3},
            {4, 5, 6},
            {7, 8, 9},
            {-1, 0, -1}
        };
        
        HashMap<Integer,int[]> positionsMap = new HashMap<>();
        
        for (int i = 0; i < numbersArray.length; i++) {
            for (int j = 0; j < numbersArray[i].length; j++) {
                int key = numbersArray[i][j];
                int[] value = {i, j};
                
                // -1은 무시 (키패드의 '*'와 '#')
                if (key != -1) {
                    positionsMap.put(key, value);
                }
            }
        }
        
        return positionsMap;
    }
}
728x90