ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Algo RhythmπŸ•ΊπŸ’ƒ] ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€ 고득점 kit λ„λ‘‘μ§ˆ
    Algo RhythmπŸ•ΊπŸ’ƒ/Programmers 2020. 8. 8. 22:49

    πŸ“š 문제 μ„€λͺ…

    도둑이 μ–΄λŠ λ§ˆμ„μ„ ν„Έ κ³„νšμ„ ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€. 이 λ§ˆμ„μ˜ λͺ¨λ“  집듀은 μ•„λž˜ κ·Έλ¦Όκ³Ό 같이 λ™κ·Έλž—κ²Œ λ°°μΉ˜λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€.

    각 집듀은 μ„œλ‘œ μΈμ ‘ν•œ 집듀과 λ°©λ²”μž₯μΉ˜κ°€ μ—°κ²°λ˜μ–΄ 있기 λ•Œλ¬Έμ— μΈμ ‘ν•œ 두 집을 ν„Έλ©΄ 경보가 μšΈλ¦½λ‹ˆλ‹€.

    각 집에 μžˆλŠ” 돈이 λ‹΄κΈ΄ λ°°μ—΄ moneyκ°€ μ£Όμ–΄μ§ˆ λ•Œ, 도둑이 ν›”μΉ  수 μžˆλŠ” 돈의 μ΅œλŒ“κ°’μ„ return ν•˜λ„λ‘ solution ν•¨μˆ˜λ₯Ό μž‘μ„±ν•˜μ„Έμš”.

     

    μ œν•œμ‚¬ν•­

    • 이 λ§ˆμ„μ— μžˆλŠ” 집은 3개 이상 1,000,000개 μ΄ν•˜μž…λ‹ˆλ‹€.

    • money λ°°μ—΄μ˜ 각 μ›μ†ŒλŠ” 0 이상 1,000 μ΄ν•˜μΈ μ •μˆ˜μž…λ‹ˆλ‹€.

     

    🎯 μ–΄λ–»κ²Œ ν’€μ—ˆλ‚˜

    Backtracking을 μ΄μš©ν•œ 첫번째 μ‹œλ„ (0/ 100) => 정확성은 λͺ¨λ‘ μ‹œκ°„ 초과, νš¨μœ¨μ„±μ€ λͺ¨λ‘ 톡과 πŸ™…‍β™‚οΈπŸ™…‍β™€οΈπŸ™…

    class Solution {
        private static int max = Integer.MIN_VALUE;
        private static int sum = 0;
        
        public int solution(int[] money) {
            int n = money.length;
            boolean[] visited = new boolean[n];
            
            backtrack(visited, money, 0, n / 2);
            
            return max;
        }
        
        public void backtrack(boolean[] visited, int[] money, int lev, int limit) {
            if(limit == lev) {
                max = Math.max(max, sum);
                return;
            }
            
            for(int i = 0; i < money.length; i++) {
                int left = (i == 0) ? money.length - 1 : i - 1;
                int right = (i == money.length - 1) ? 0 : i + 1;
                
                
                if(visited[i] == false) {
                    visited[left] = true; 
                    visited[right] = true;
                    visited[i] = true;
                    
                    sum += money[i];
                    backtrack(visited, money, lev + 1, limit);
                }
                
                visited[left] = false; 
                visited[right] = false;
                visited[i] = false;
                sum -= money[i];
            }
        }
    }

     

    DPλ₯Ό μ΄μš©ν•œ μ΅œμ’… μ½”λ“œ

    class Solution {
        public int solution(int[] money) {
            int n = money.length;
            int[] arr = new int[n];
            int result1, result2;
            
            // result1 => (0 ~ n - 2)κΉŒμ§€
            arr[0] = money[0];
            arr[1] = Math.max(money[0], money[1]);
            
            for(int i = 2; i < n - 1; i++) {
                arr[i] = Math.max(money[i] + arr[i - 2], arr[i - 1]);
            }
            
            result1 = arr[n - 2];
            
            // result2 => (1 ~ n - 1)κΉŒμ§€
            arr[1] = money[1];
            arr[2] = Math.max(money[1], money[2]);
            
            for(int i = 3; i < n; i++) {
                arr[i] = Math.max(money[i] + arr[i - 2], arr[i - 1]);
            }
            
            result2 = arr[n - 1];
     
            return Math.max(result1, result2);
        }
    }

     

    🧐 μ™œ μ €λ ‡κ²Œ ν’€μ—ˆλ‚˜

    Backtracking을 μ΄μš©ν•œ 첫번째 μ‹œλ„

    λͺ¨λ“  집은 가지고 μžˆλŠ” 돈이 0 이상이닀. κ·Έλž˜μ„œ 도둑은 일반적으둜 λ§Žμ€ 집을 ν„Έμˆ˜λ‘ 더 λ§Žμ€ λˆμ„ ν›”μΉ  수 μžˆλ‹€. κ·ΈλŸ¬λ‚˜ 도둑은 μ„œλ‘œ μΈμ ‘ν•œ 집은 ν„Έ 수 μ—†λ‹€. 이런 μƒν™©μ—μ„œ λ§Œμ•½ λ§ˆμ„μ— n개의 집이 μžˆλ‹€λ©΄ 도둑은 μ΅œλŒ€ν•œ λ§Žμ€ λˆμ„ ν›”μΉ˜κΈ° μœ„ν•΄ n / 2개의 집을 ν„Έμ–΄μ•Ό ν•œλ‹€. 이λ₯Ό μ‹œκ°ν™”ν•˜λ©΄ λ‹€μŒκ³Ό κ°™κ³  μ΄λŠ” backtracking을 μ΄μš©ν•΄μ„œ κ΅¬ν˜„ν•˜κΈ°μ— μ•ˆμ„±λ§žμΆ€μ΄λ‹€.

     

     

     

    ν•˜μ§€λ§Œ λ¬Έμ œλŠ” νš¨μœ¨μ΄μ—ˆλ‹€. λͺ¨λ“  경우λ₯Ό λ‹€ ν™•μΈν•˜κΈ° λ•Œλ¬Έμ— μ •ν™•ν•˜μ§€λ§Œ λŠλ¦¬λ‹€. κ°œμ„ ν•  ν•„μš”κ°€ μžˆμ—ˆλ‹€.

     

    DPλ₯Ό μ΄μš©ν•œ μ΅œμ’… μ½”λ“œ

    λ§ˆμ„μ— 집듀이 λ™κ·Έλž—κ²Œ λ°°μΉ˜λ˜μ–΄ μžˆλŠ” 것이 μ•„λ‹ˆλΌ 일렬둜 λ°°μΉ˜λ˜μ–΄ μžˆλ‹€κ³  κ°€μ •ν•˜μž.

    λ§Œμ•½ 도둑이 ν•œ 집씩 μ°¨λ‘€λŒ€λ‘œ λ°©λ¬Έν•˜λ©΄μ„œ 털지 말지λ₯Ό κ²°μ •ν•˜λŠ”λ° λ‹€μŒκ³Ό 같이 λ‘λ²ˆμ§Έ 집을 λ°©λ¬Έν–ˆλ‹€κ³  κ°€μ •ν•΄λ³΄μž. μ΄λ•Œ 도둑이 λ‘λ²ˆμ§Έ 집을 ν„΄λ‹€λ©΄ 첫번째 집은 ν„Έ 수 μ—†λ‹€. λ°˜λŒ€λ‘œ 도둑이 λ‘λ²ˆμ§Έ 집을 털지 μ•ŠλŠ”λ‹€λ©΄ 첫번째 집을 ν„Έ 수 μžˆλ‹€.

     

     

    이λ₯Ό 톡해 μš°λ¦¬λŠ” 도둑은 (λ‘λ²ˆμ§Έ 집을 ν„Έμ—ˆμ„ λ•Œ 얻을 수 μžˆλŠ” κΈˆμ•‘ + 0번째 집을 ν„Έμ—ˆμ„ λ•Œ 얻을 수 μžˆλŠ” 돈)이 (첫번째 집을 ν„Έμ—ˆμ„ λ•Œ 얻을 수 μžˆλŠ” κΈˆμ•‘)보닀 클 λ•Œ λ‘λ²ˆμ§Έ 집을 ν„Έμ–΄μ•Ό ν•œλ‹€λŠ” 것을 μ•Œ 수 μžˆλ‹€.

     

    이λ₯Ό 더 ν™•μž₯μ‹œν‚€λ©΄ 도둑이 n번째 집을 ν„Έμ–΄μ•Ό ν•˜λŠ” 기쀀은 (n번째 집을 ν„Έμ—ˆμ„ λ•Œ 얻을 수 μžˆλŠ” κΈˆμ•‘ + n - 2번째 μ§‘κΉŒμ§€ ν™•μΈν•΄μ„œ 얻을 수 μžˆλŠ” μ΅œλŒ€μ˜ κΈˆμ•‘)이 (n-1번째 μ§‘κΉŒμ§€ ν™•μΈν•΄μ„œ 얻을 수 μžˆλŠ” μ΅œλŒ€μ˜ κΈˆμ•‘)μ΄λΌλŠ” 사싀을 μ•Œ 수 μžˆλ‹€.

     

    ν•˜μ§€λ§Œ 우리의 상황은 μœ„μ™€ 쑰금 λ‹€λ₯΄λ‹€. λ§ˆμ„μ€ 일렬둜 λ°°μΉ˜λ˜μ–΄ μžˆμ§€ μ•Šκ³  λ™κ·Έλž—κ²Œ λ°°μΉ˜λ˜μ–΄ μžˆλ‹€.

    κ·Έλž˜μ„œ 0번째 집을 ν„Έλ©΄ n-1번째 집을 ν„Έ 수 μ—†λ‹€. λ°˜λŒ€λ‘œ 0번째 집을 털지 μ•ŠμœΌλ©΄ n-1번째 집을 ν„Έ 수 μžˆλ‹€.

    이λ₯Ό μ‹œκ°ν™”ν•˜λ©΄ λ‹€μŒκ³Ό κ°™κ³  이λ₯Ό 톡해 μš°λ¦¬λŠ” 0번째 집뢀터 n-2번째 μ§‘κΉŒμ§€ ν„Έμ—ˆμ„ λ•Œ 얻을 수 μžˆλŠ” μ΅œλŒ€μ˜ κΈˆμ•‘κ³Ό 1번째 집뢀터 n-1번째 μ§‘κΉŒμ§€ ν„Έμ—ˆμ„ λ•Œ 얻을 수 μžˆλŠ” μ΅œλŒ€μ˜ κΈˆμ•‘ 쀑 더 큰 κΈˆμ•‘μ„ κ³ λ₯΄λ©΄ λœλ‹€λŠ” 것을 μ•Œ 수 μžˆλ‹€.

     

     

    πŸ“–  무엇을 λ°°μ› λ‚˜

    λŒ“κΈ€

Designed by Tistory.