λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°

Algorithm

[Algorithm/Java][ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€] ν‚€νŒ¨λ“œ λˆ„λ₯΄κΈ°

λ°˜μ‘ν˜•

[ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€] ν‚€νŒ¨λ“œ λˆ„λ₯΄κΈ°

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

문제 μ„€λͺ…

슀마트폰 μ „ν™” ν‚€νŒ¨λ“œμ˜ 각 칸에 λ‹€μŒκ³Ό 같이 μˆ«μžλ“€μ΄ μ ν˜€ μžˆμŠ΅λ‹ˆλ‹€.

이 μ „ν™” ν‚€νŒ¨λ“œμ—μ„œ 왼손과 였λ₯Έμ†μ˜ μ—„μ§€μ†κ°€λ½λ§Œμ„ μ΄μš©ν•΄μ„œ μˆ«μžλ§Œμ„ μž…λ ₯ν•˜λ €κ³  ν•©λ‹ˆλ‹€.
맨 처음 왼손 엄지손가락은 * ν‚€νŒ¨λ“œμ— 였λ₯Έμ† 엄지손가락은 # ν‚€νŒ¨λ“œ μœ„μΉ˜μ—μ„œ μ‹œμž‘ν•˜λ©°, 엄지손가락을 μ‚¬μš©ν•˜λŠ” κ·œμΉ™μ€ λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

  1. 엄지손가락은 μƒν•˜μ’Œμš° 4가지 λ°©ν–₯으둜만 이동할 수 있으며 ν‚€νŒ¨λ“œ 이동 ν•œ 칸은 거리둜 1에 ν•΄λ‹Ήν•©λ‹ˆλ‹€.
  2. μ™Όμͺ½ μ—΄μ˜ 3개의 숫자 1, 4, 7을 μž…λ ₯ν•  λ•ŒλŠ” 왼손 엄지손가락을 μ‚¬μš©ν•©λ‹ˆλ‹€.
  3. 였λ₯Έμͺ½ μ—΄μ˜ 3개의 숫자 3, 6, 9λ₯Ό μž…λ ₯ν•  λ•ŒλŠ” 였λ₯Έμ† 엄지손가락을 μ‚¬μš©ν•©λ‹ˆλ‹€.
  4. κ°€μš΄λ° μ—΄μ˜ 4개의 숫자 2, 5, 8, 0을 μž…λ ₯ν•  λ•ŒλŠ” 두 μ—„μ§€μ†κ°€λ½μ˜ ν˜„μž¬ ν‚€νŒ¨λ“œμ˜ μœ„μΉ˜μ—μ„œ 더 κ°€κΉŒμš΄ 엄지손가락을 μ‚¬μš©ν•©λ‹ˆλ‹€.
    4-1. λ§Œμ•½ 두 μ—„μ§€μ†κ°€λ½μ˜ 거리가 κ°™λ‹€λ©΄, 였λ₯Έμ†μž‘μ΄λŠ” 였λ₯Έμ† 엄지손가락, μ™Όμ†μž‘μ΄λŠ” 왼손 엄지손가락을 μ‚¬μš©ν•©λ‹ˆλ‹€.

μˆœμ„œλŒ€λ‘œ λˆ„λ₯Ό λ²ˆν˜Έκ°€ λ‹΄κΈ΄ λ°°μ—΄ numbers, μ™Όμ†μž‘μ΄μΈμ§€ 였λ₯Έμ†μž‘이인 지λ₯Ό λ‚˜νƒ€λ‚΄λŠ” λ¬Έμžμ—΄ handκ°€ λ§€κ°œλ³€μˆ˜λ‘œ μ£Όμ–΄μ§ˆ λ•Œ, 각 번호λ₯Ό λˆ„λ₯Έ 엄지손가락이 왼손인 지 였λ₯Έμ†μΈ 지λ₯Ό λ‚˜νƒ€λ‚΄λŠ” μ—°μ†λœ λ¬Έμžμ—΄ ν˜•νƒœλ‘œ return ν•˜λ„λ‘ solution ν•¨μˆ˜λ₯Ό μ™„μ„±ν•΄μ£Όμ„Έμš”.

μ œν•œμ‚¬ν•­

  • numbers λ°°μ—΄μ˜ ν¬κΈ°λŠ” 1 이상 1,000 μ΄ν•˜μž…λ‹ˆλ‹€.
  • numbers λ°°μ—΄ μ›μ†Œμ˜ 값은 0 이상 9 μ΄ν•˜μΈ μ •μˆ˜μž…λ‹ˆλ‹€.
  • handλŠ” "left" λ˜λŠ” "right" μž…λ‹ˆλ‹€.
  • "left"λŠ” μ™Όμ†μž‘μ΄, "right"λŠ” 였λ₯Έμ†μž‘이λ₯Ό μ˜λ―Έν•©λ‹ˆλ‹€.
  • 왼손 엄지손가락을 μ‚¬μš©ν•œ κ²½μš°λŠ” L, 였λ₯Έμ† 엄지손가락을 μ‚¬μš©ν•œ κ²½μš°λŠ” R을 μˆœμ„œλŒ€λ‘œ 이어뢙여 λ¬Έμžμ—΄ ν˜•νƒœλ‘œ return ν•΄μ£Όμ„Έμš”.

Code

class Solution {
    public String solution(int[] numbers, String hand) {
        String answer = new String();
        int left=10,right=12;
        for(int number: numbers){
            if(number==0) number=11;
            if(number%3 ==1){
                answer += "L";
                left = number;
            }
            else if(number%3==0){
                answer += "R";
                right = number;
            }
            else {
                int leftLength = getLength(left, number);
                int rightLength = getLength(right, number);
                if(leftLength>rightLength){
                    answer += "R";
                    right = number;
                } 
                else if(leftLength<rightLength){
                    answer += "L";
                    left = number;
                }
                else {
                    if(hand.equals("left")){
                        answer += "L";
                        left = number;
                    }
                    else {
                        answer += "R";
                        right = number;
                    }
                }
            }
        }
        return answer;
    }
    public int getLength(int start, int end){ 
        int x = (start-1)/3;
        int y = (start-1)%3;
        int endX = end/3;
        int endY = 1;
        return Math.abs(x-endX) + Math.abs(y-endY);
    }
}

Code μ„€λͺ…

ν‚€νŒ¨λ“œλ₯Ό μ’Œν‘œλ‘œ λ³€ν™˜ν•΄μ„œ 생각을 ν•΄λ³΄μ•˜λ‹€. 맨 μ•„λž«μ€„ *, 0, #은 각각 10,11,12 라고 μƒκ°ν–ˆλ‹€.
ν‚€νŒ¨λ“œμ—μ„œ 1이 (0,0), 2κ°€ (0,1) 이런 μ‹μœΌλ‘œ μƒκ°ν•˜κ³  κ·œμΉ™μ„ μ°Ύμ•„λ³΄λ‹ˆ
맨 μ™Όμͺ½μ€„은 3으둜 λ‚˜λˆ„μ—ˆμ„λ•Œ λ‚˜λ¨Έμ§€κ°€ 1이고, 맨 였λ₯Έμͺ½μ€„은 3으둜 λ‚˜λˆ„μ—ˆμ„ λ•Œ λ‚˜λ¨Έμ§€κ°€ 0이닀. μ΄λŸ°μ‹μœΌλ‘œ 왼손과 였λ₯Έμ†μ„ κ΅¬λΆ„ν–ˆκ³  λˆ„λ₯Έ 수λ₯Ό left와 right에 μ €μž₯ν•¨μœΌλ‘œμ¨ κ°€μž₯ λ§ˆμ§€λ§‰μ— λˆ„λ₯Έ 수λ₯Ό κΈ°μ–΅ν•˜κ²Œ ν–ˆλ‹€.
그리고 κ°€μš΄λ°μ€„ μΌλ•ŒλŠ” getLengthν•¨μˆ˜λ₯Ό μ΄μš©ν•΄μ„œ μ–΄λ–€ 손이 더 κ°€κΉŒμš΄μ§€ μ•Œμ•„λ‚΄κΈ°μœ„ν•΄μ„œ 각각의 μ†μ—μ„œ 이번 number에 거리λ₯Ό κ΅¬ν–ˆλ‹€.
λ‚˜μ˜¨ 거리λ₯Ό λ°”νƒ•μœΌλ‘œ μ™Όμ†μœΌλ‘œ κ°ˆμ§€ 였λ₯Έμ†μœΌλ‘œ κ°ˆμ§€λ₯Ό μ •ν•΄μ£Όμ—ˆλ‹€.

배운점

이번 문제λ₯Ό ν’€λ©΄μ„œ λ¨Όμ € μ’Œν‘œλ‘œ μΉ˜ν™˜ν•΄μ„œ μƒκ°ν•˜λ‹ˆκΉŒ 거리λ₯Ό κ΅¬ν•˜λŠ”κ²Œ κ°€λŠ₯ν•΄μ‘Œκ³ , μ’Œν‘œλ‘œ μΉ˜ν™˜ν•˜λŠ” κ³Όμ •μ—μ„œ κ·œμΉ™μ„ 찾음으둜써
μ½”λ“œλ₯Ό 더 짧게 λ§Œλ“€ 수 μžˆμ—ˆλ‹€.

λ°˜μ‘ν˜•