ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 다람쥐 옮기기
    코딩 테스트/Level 3 2021. 10. 14. 12:14
    반응형

    상자를 이용하여 최다(多)의 다람쥐를 옮겨야 한다.
    다음 조건을 만족하며 이동 가능한 최대의 다람쥐의 수는?

    1) 박스는 2개이다.
    2) 박스는 30kg 이하까지 담을 수 있다.
    3) 다람쥐는 총 9마리이다.
    4) 다람쥐의 몸무게(kg)는 각각 [12, 9, 9, 22, 12, 8, 5, 2, 3]이다.

     

    순열을 이용한 전수조사(brute force)

    from itertools import permutations
    
    
    def solution(weights):
        answer = 0
        for p_weights in permutations(weights):
            start = count = 0
            for _ in range(2):
                in_box = 0
                for i in range(start, 9):
                    if (temp := in_box + p_weights[i]) <= 30:
                        count += 1
                        in_box = temp
                    else:
                        start = i
                        break
            answer = max(count, answer)
        return answer
    
    
    print(solution([12, 9, 9, 22, 12, 8, 5, 2, 3]))

     

    재귀로....

    일단 박스 1개로 확인.. 

    def solution(weights, box=30, n=9):
        if box == 0 or n == 0:
            return 0
        if weights[n - 1] > box:
            return solution(weights, box, n - 1)
        elif box >= weights[n - 1]:
            return max(1 + solution(weights, box - weights[n - 1], n - 1),
                       solution(weights, box, n - 1))
    
    
    print(solution([12, 9, 9, 22, 12, 8, 5, 2, 3])) # 5

    확인을 위해 배열로 바꿔서...

    def solution(weights, box=[], n=9):
        capacity = 30 - sum(box)
        if capacity == 0 or n == 0:
            # print(box)
            return 0
        if weights[n - 1] > capacity:
            return solution(weights, box, n - 1)
        else:
            return max(1 + solution(weights, box + [weights[n - 1]], n - 1),
                       solution(weights, box, n - 1))
    
    
    print(solution([12, 9, 9, 22, 12, 8, 5, 2, 3]))

    잘 작동 되는 것 같은 느낌인데...

    박스 2개로....

    def solution(weights, box1=30, box2=30, n=9):
        if (box1 == 0 and box2 == 0) or n == 0:
            return 0
        if weights[n - 1] > box1 and weights[n - 1] > box2:
            return solution(weights, box1, box2, n - 1)
        elif box1 >= weights[n - 1] > box2:
            return max(1 + solution(weights, box1 - weights[n - 1], box2, n - 1),
                       solution(weights, box1, box2, n - 1))
        elif box2 >= weights[n - 1] > box1:
            return max(1 + solution(weights, box1, box2 - weights[n - 1], n - 1),
                       solution(weights, box1, box2, n - 1))
        else:
            return max(1 + solution(weights, box1 - weights[n - 1], box2, n - 1),
                       1 + solution(weights, box1, box2 - weights[n - 1], n - 1),
                       solution(weights, box1, box2, n - 1))
    
    
    print(solution([12, 9, 9, 22, 12, 8, 5, 2, 3]))


    작동 과정을 확인하기 위해...

    def solution(weights, box1=[], box2=[], n=9):
        capacity1, capacity2 = 30 - sum(box1), 30 - sum(box2)
        if (capacity1 == 0 and capacity2 == 0) or n == 0:
            # print(box1, box2)
            return 0
        if weights[n - 1] > capacity1 and weights[n - 1] > capacity2:
            return solution(weights, box1, box2, n - 1)
        elif capacity1 >= weights[n - 1] > capacity2:
            return max(1 + solution(weights, box1 + [weights[n - 1]], box2, n - 1),
                       solution(weights, box1, box2, n - 1))
        elif capacity2 >= weights[n - 1] > capacity1:
            return max(1 + solution(weights, box1, box2 + [weights[n - 1]], n - 1),
                       solution(weights, box1, box2, n - 1))
        else:
            return max(1 + solution(weights, box1 + [weights[n - 1]], box2, n - 1),
                       1 + solution(weights, box1, box2 + [weights[n - 1]], n - 1),
                       solution(weights, box1, box2, n - 1))
    
    
    print(solution([12, 9, 9, 22, 12, 8, 5, 2, 3]))

     

    배열을 이용하는 방법도 있지만....

    반응형
Designed by Tistory.