Algorithm/SWEA
[SWEA] 5215 햄버거 다이어트 (파이썬/python) - 백트래킹, combinations
chjcoder
2023. 11. 16. 23:26
🎈문제
🎁알고리즘 및 접근
경우의 수
1. itertools를 사용하는 방법과 백트래킹을 사용하는 방법이 있다.
2. 중복 x, 순서 상관 x 이므로 itertools의 combinations를 사용해보자.
3. 백트래킹으로 안해보면 아쉬우니까 백트래킹 코드도 소개한다.
💻 combinations를 사용한 코드
# swea 햄버거 다이어트 - combinations활용
from itertools import combinations
T = int(input())
for test_case in range(1,T+1):
n, l = map(int,input().split())
hamburger = []
for _ in range(n):
t,k = map(int,input().split()) # 점수, 칼로리
hamburger.append([t,k])
count_answer = 0
for i in range(1,n+1):
for j in combinations(hamburger,i):
cnt_kal = 0
cnt_tast = 0
for m in j:
cnt_kal += m[1]
cnt_tast += m[0]
if cnt_kal <= l:
count_answer = max(cnt_tast,count_answer)
print(f"#{test_case} {count_answer}")
💻 백트래킹을 사용한 코드
# swea 5215 햄버거 다이어트 - 백트래킹 활용
def check(num,hamburger):
cnt_score = 0
cnt_kal = 0
for i in range(num):
cnt_score += hamburger[i][0]
cnt_kal += hamburger[i][1]
if cnt_kal <= l:
return cnt_score
return 0
def dfs(num,depth):
global answer
if num == len(hamburger):
answer = max(answer, check(num,hamburger))
return
for i in range(depth,n):
hamburger.append(ingredients[i])
dfs(num,i+1)
hamburger.pop()
return
T = int(input())
for test_case in range(1,T+1):
n, l = map(int,input().split())
# 햄버거 재료 입력 받기
ingredients = []
for _ in range(n):
t,k = map(int,input().split()) # 점수, 칼로리
ingredients.append([t,k])
answer = 0
hamburger = []
for num in range(1,n+1):
dfs(num,0)
print(f"#{test_case} {answer}")
🎄코드 설명
쉬워서 코드에 대한 설명은 생략한다.
백트래킹으로 꼭 풀어보자.
백트래킹 코드가 어렵다면 백준 백트래킹 문제를 꼭 모두 풀어보고 넘어가자.