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)