하루일문

[백준] 1535번 안녕(파이썬) 본문

algorithm/baekjoon

[백준] 1535번 안녕(파이썬)

support_u 2023. 4. 8. 19:48

문제

 

1535번: 안녕

첫째 줄에 사람의 수 N(≤ 20)이 들어온다. 둘째 줄에는 각각의 사람에게 인사를 할 때, 잃는 체력이 1번 사람부터 순서대로 들어오고, 셋째 줄에는 각각의 사람에게 인사를 할 때, 얻는 기쁨이 1번

www.acmicpc.net

풀이

함수(내 풀이)

def pleasuer(l, j, i):
    global L, J, joy
    # 마지막인덱스에 도착했을때 들어간다
    if i == n:
        # joy보다 커졌을때 저장한다
        if joy < j:
            joy = j
        # 마지막 인덱스라면 리턴한다
        return
    # 마지막 인덱스에 갈떄까지 재귀
    pleasuer (l, j, i+1)
    # 리턴 시 돌아온다 & 뒤에서부터 L[i]를 뺴도 0보다 크다면 들어간다/ 아님 풀린다.
    if l - L[i] > 0:
        pleasuer(l - L[i], j + J[i], i+1)
    
n = int(input())

L = list(map(int, input().split()))
J = list(map(int, input().split()))

l, j = 100, 0

joy =0
pleasuer(l, j, 0)

print(joy)

for문(블로그 참고)

n = int(input())

L = [0] + list(map(int, input().split()))
J = [0] + list(map(int, input().split()))

# 사람만큼의 이중리스트를 만들고 행복만큼 갯수를 넣는다
pleasure = [[0] * 101 for _ in range(n+1)]

# 사람만큼 돈다
for i in range(1, n+1):
    #  행복만큼 돈다
    for j in range(1, 101):
        # 체력이 남아있다면 전 리스트의 최대행복과 전 리스르틔 전 최대행복 + 지금 얻는 행복 중 큰 수를 고른다
        if j - L[i] > 0:
          pleasure[i][j] = max(pleasure[i-1][j], pleasure[i-1][j-L[i]]+J[i])
        # 안남는다면 전 수를 끌고 온다.
        else:
           pleasure[i][j] = pleasure[i-1][j]

print(pleasure[n][99])

아직까지 남의 풀이가 잘 이해가 가지 않는다...ㅠ