문제





힌트

  • 왼손으로 눌러야만 하는 숫자는 1, 4, 7 최초위치는 *입니다.
  • *을 만약 10로 치환한다면 왼손으로 눌러야하는 숫자는 모두 n % 3 == 1을 만족합니다.
  • 오른손으로 눌러야만 하는 숫자는 3, 6, 9 최초위치는 #입니다.
  • #을 만약 12로 치환한다면 오른손으로 눌러야하는 숫자는 모두 n % 3 == 0을 만족합니다.
  • 같은 맥락으로 가운데 숫자들은 0을 11로 치환할 경우 모두 n % 3 == 2를 만족합니다.
  • 각각의 손가락이 마지막으로 위치한 곳을 저장하고 가운데 숫자를 눌러야 할 경우 거리를 계산하여 올바른 손가락을 구합니다.
  • 구하는 공식
    • x좌표 = (n-1) / 3
    • y좌표 = (n-1) % 3
    • 이동거리 = 절대값(현x좌표 - 목표값x좌표) + 절대값(현y좌표 - 목표값y좌표)

풀이

class Solution {
    private Hand leftHand = new Hand(10, "left"); // 왼손: *을 10으로 치환
    private Hand rightHand = new Hand(12, "right"); // 오른손 #을 12로 치환

    public String solution(int[] numbers, String hand) {
        StringBuilder stb = new StringBuilder();

        for(int number : numbers) { // 눌러야 할 숫자를 가져옴
            if(number % 3 == 1) { // n % 3 == 1 경우 왼손
                stb.append("L");
                leftHand.setPosition(number);
            }
            else if(number != 0 && (number % 3 == 0)) { // 0이 아니고 n % 3 == 3 경우 오른손
                stb.append("R");
                rightHand.setPosition(number);
            }
            else { // 가운데 숫자들
                String properHand = findProperHand(number, hand);
                stb.append(properHand);
            }
        }

        return stb.toString();
    }

    String findProperHand(int number, String hand) {
        int distanceFromLeft = calculateDistance(leftHand, number); // 왼손거리 계산
        int distanceFromRight = calculateDistance(rightHand, number); // 오른손거리 계산

        if(distanceFromLeft == distanceFromRight) { // 두개가 같으면
            if(hand.equals(rightHand.getRightOrLeftStr())) { // 주 사용 손이 오른손이면
                rightHand.setPosition(number); // 오른손 위치 변경
                return "R"; // 해당 숫자는 오른손으로 눌러야함
            }
            else { // 주 사용손이 왼손이면
                leftHand.setPosition(number); // 왼손 위치 변경
                return "L"; // 해당 숫자는 왼손으로 눌러야함
            }
        } else if (distanceFromLeft < distanceFromRight) { // 왼손이 가까우면
            leftHand.setPosition(number); // 왼손 위치 변경
            return "L"; // 해당 숫자는 왼손으로 눌러야함
        }
        else { // 오른손이 가까우면
            rightHand.setPosition(number); // 오른손 위치 변경
            return "R"; // 해당 숫자는 오른손으로 눌러야함
        }
    }

    int calculateDistance(Hand hand, int number) {
        int position = hand.getPosition();

        if (position  == 0) position = 11; // 0은 11로 치환한다
        if (number == 0 ) number = 11;

        int positionX = (position - 1) / 3;
        int positionY = (position - 1) % 3;

        int numX = (number - 1) / 3;
        int numY = (number - 1) % 3;

        int distance = Math.abs(positionX - numX) + Math.abs(positionY - numY);

        return distance;
    }

}
class Hand { // 자바의 객체지향성 활용하여 class 생성
    private int position;
    private String rightOrLeftStr;

    Hand(int position, String rightOrLeftStr) {
        this.position = position;
        this.rightOrLeftStr = rightOrLeftStr;
    }

    public void setPosition(int position) {
        this.position = position;
    }

    public int getPosition() {
        return position;
    }

    public String getRightOrLeftStr() {
        return rightOrLeftStr;
    }
}
출처

프로그래머스 - lv1 - 키패드누르기

0개의 댓글