🎈문제
🎁알고리즘 및 접근
경우의 수
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}")
🎄코드 설명
쉬워서 코드에 대한 설명은 생략한다.
백트래킹으로 꼭 풀어보자.
백트래킹 코드가 어렵다면 백준 백트래킹 문제를 꼭 모두 풀어보고 넘어가자.
'Algorithm > SWEA' 카테고리의 다른 글
[swea] 1289 원재의 메모리 복구하기(파이썬/python) - 빠른 코드 (1) | 2023.11.11 |
---|---|
[swea] 2805 농작물 수확하기(파이썬/python) (0) | 2023.11.02 |
[swea] 1209 sum(파이썬/python) (0) | 2023.10.30 |
[SWEA] 2001 파리퇴치 (파이썬/python) (1) | 2023.10.18 |
[SWEA] 1208 Flatten (파이썬/python) (2) | 2023.10.18 |