티스토리 뷰

Problem solution

바둑이 승차

dev_jun 2022. 7. 26. 12:38

문제 포인트

  • 트럭에 바둑이를 태우는데, 트럭은 C 킬로그램 넘게 태울 수 없다.
  • C를 넘지 않으면서 바둑이를 가장 무겁게 태우고 싶다.
  • 트럭에 태울 수 있는 가장 무거운 무게를 출력하라
  • N: 바둑이 마릿수, W: 각 바둑이의 무게

생각 포인트

  • 경우의 수를 따지며, 문제에서 요구하는 최적의 해를 구해야하는 문제
  • 따라서 DFS를 사용하여 풀겠다.

my_solution

def recursive(level, sum):
    global largest

    if sum > c:
        return

    if level == n:
        if sum > largest:
            largest = sum

    else:
        recursive(level + 1, sum + weights[level])
        recursive(level + 1, sum)


print(largest)

my_solution 해석

  • 재귀를 사용한다.
  • 입력값이 굉장히 많고 큰 경우에 타임 아웃
    • 불필요한 연산을 하지 않는 케이스를 생각하여 불필요한 연산을 진행하지 않도록 하는 cut-edge 부족
    • 이번 문제에서는 다음과 같은 과정이 필요했다.
      • 현재까지 태우기로 한 바둑이 무게의 합(sum)
      • 주어진 바둑이 전체 무게의 합(total)
      • 트럭에 태우기로 판단한 바둑이의 무게(total_sum)
      • total - total_sum: 앞으로 태워야 할 바둑이의 무게
      • total - total_sum + sum < result: 현재까지 태우기로 판단한 무게와 앞으로 태울 무게를 더했는데도 현재 구한 최적의 해보다 작다면 이는 더이상 최적의 해일 수 없기 때문에 추가 연산을 하지 않는다.

solution

result = -2147000000
total = sum(weights)


def recursive(level, sum, total_sum):
    global result

    if sum + (total-total_sum) < result:
        return

    if level == n:
        if sum > result:
            result = sum
    else:
        recursive(level + 1, sum + weights[level], total_sum + weights[level])
        recursive(level + 1, sum, total_sum + weights[level])


recursive(0, 0, 0)

'Problem solution' 카테고리의 다른 글

동전 교환  (0) 2022.07.27
중복순열 구하기  (0) 2022.07.27
합이 같은 부분집합  (0) 2022.07.26
최소힙  (0) 2022.07.25
최대힙  (0) 2022.07.25
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함