For Programmer

백준 14501번 파이썬 문제풀이(브루트 포스 - 퇴사) 본문

코팅테스트/백준 문제 모음

백준 14501번 파이썬 문제풀이(브루트 포스 - 퇴사)

유지광이 2021. 10. 20. 18:16
728x90

코드

# n+1일째 되는 날 퇴사
n = int(input())
t = [0] * (n + 1)
p = [0] * (n + 1)

answer = 0

for i in range(1, n + 1):
    t[i], p[i] = map(int, input().split())


def go(day, sum_):
    global answer

    # 종료조건: 퇴사날에 딱 맞췄을 때
    if day == n + 1:
        answer = max(sum_, answer)
        return

    # 불가능한 경우: 상담을 했을 때, 퇴사날을 넘어가는 경우
    if day > n + 1:
        return

    # 상담을 한다
    go(day + t[day], sum_ + p[day])

    # 상담을 안한다
    go(day + 1, sum_)


go(1, 0)
print(answer)

-> 아무리 생각해도 혼자서 이걸 재귀로 생각한다는건 쉽지 않은거 같다.

이 문제의 핵심은 조건이 N+1 일때 return한다는 것과 n+1보다 클때도 Return 한다는것 이 두가지를 생각해야 한다.

또한 상담을 할때와 안할때(그냥 다음날로 넘어가는경우)를 분기해서 재귀를 돌려야한다는 것도 상당히 어려운 부분이다.

 

다음은 위와 같은 코드이지만 이중리스트에 저장해놓고 푼 코드이다. 

N = int(input())
array = [[0, 0]]
for _ in range(N):
    T, P = map(int, input().split())
    array.append([T, P])

result = 0


def solve(day, sum_):
    global result
    if day == N + 1:
        result = max(result, sum_)
        return
    if day > N + 1:
        return

    solve(array[day][0] + day, sum_ + array[day][1])

    solve(day + 1, sum_)


solve(1, 0)
print(result)
728x90
Comments