[BJ14501] 퇴사

🚩 문제 설명

https://www.acmicpc.net/problem/14501

 

14501번: 퇴사

첫째 줄에 백준이가 얻을 수 있는 최대 이익을 출력한다.

www.acmicpc.net

⏱️ 시간 복잡도
▪O(N^2)

◾ 백준이가 얻을 수 있는 최대 수익을 구하는 문제

◾ 퇴사 날에는 탈출하고, 그 이전까지 일을 할 수 있습니다.

 

 

 


 

 

 

입출력

변수 설명

n : 일하는 총일, n+1날 퇴사

t p : n 개의 줄 (걸리는 기간, 받을 수 있는 금액)

return 벌수있는 최대수익

✔️ 예제 1

7
3 10
5 20
1 10
1 20
2 15
4 40
2 200
45

✔️ 예제 2

10
1 1
1 2
1 3
1 4
1 5
1 6
1 7
1 8
1 9
1 10
55

✔️ 예제 3

10
5 50
4 40
3 30
2 20
1 10
1 10
2 20
3 30
4 40
5 50
90

 

 


 

 

 

📑 문제 풀이

with 파이썬 (Python)

import sys

sys.stdin = open('input.txt', 'rt')
input = sys.stdin.readline

n = int(input())  # 일 수
t = [0]  # 일하는 데 걸리는 시간
p = [0]  # 일하면 버는 수익

# 배열 입력
for _ in range(n):
    tmp = list(map(int, input().split()))
    t.append(tmp[0])
    p.append(tmp[1])


def dfs(day, tot):
    global ans

    # 퇴사날짜 이후면 탈출
    if day > n + 1:
        return

    # 해당 퇴사날짜라면
    if day == n + 1:
        ans = max(ans, tot)
        return

    dfs(day + 1, tot)  # 일을 하지 않는 경우
    dfs(day + t[day], tot + p[day])  # 일을 하는우경우


if __name__ == '__main__':
    ans = 0
    dfs(1, 0)
    print(ans)

💬 Point

➡️  재귀를 사용하여 수익을 구한다.
➡️  global ans

 

n = int(input())  # 일 수
t = [0]  # 일하는 데 걸리는 시간
p = [0]  # 일하면 버는 수익

# 배열 입력
for _ in range(n):
    tmp = list(map(int, input().split()))
    t.append(tmp[0])
    p.append(tmp[1])

◾ 입력을 받습니다. 각각 배열에 추가해줍니다.

 

def dfs(day, tot):
    global ans

    # 퇴사날짜 이후면 탈출
    if day > n + 1:
        return

    # 해당 퇴사날짜라면
    if day == n + 1:
        ans = max(ans, tot)
        return

    dfs(day + 1, tot)  # 일을 하지 않는 경우
    dfs(day + t[day], tot + p[day])  # 일을 하는 경우

◾ 만약 퇴사날짜 이후면 불가능한 경우이므로 탈출을 해야합니다. return 을 해줍니다.

만약 퇴사날짜가 된다면 최대값을 비교하여 구해봅니다.

 

◾ 일을 하지 않고 넘기는 경우도 세야합니다.

위 예시를 보면 ( day 1 -> day 6 -> day 7 : 50 + 10 + 20 = 80 ) 이 아니라 day 6 을 쉬고 수익을 더 벌 수 있는 day 8 에서 일을 할 수 있습니다. 그렇게 되면 (day 1 -> day 6 -> day 8 : 50 + 10 + 30 = 90 ) 80 이 아닌 90 을 벌 수 있게 됩니다.

 

dfs(day + 1, tot)  # 일을 하지 않는 경우
dfs(day + t[day], tot + p[day])  # 일을 하는 경우

◾ 따라서 일을 하는 경우와 일을 하지 않는 경우 모두 돌아줘야 합니다.

마치 이런 트리와 같은 형태인 것입니다. 두 가지의 경우를 dfs() 돌아 연결될 수 있도록 코드를 작성해줍시다.

 

 

 

 

 

 

 

 

 

 

 

 

# 알고리즘 백준 bj14501 퇴사 python dfs

# 알고리즘 백준 퇴사 파이썬 dfs 재귀


 

728x90

'✏️ 𝗔𝗹𝗴𝗼𝗿𝗶𝘁𝗵𝗺 > 백준 알고리즘' 카테고리의 다른 글

[BJ14503] 로봇 청소기  (0) 2022.05.07
[BJ14502] 연구소  (0) 2022.05.04
[BJ14500] 테트로미노  (0) 2022.04.30
[BJ14499] 주사위 굴리기  (0) 2022.04.29
[BJ13458] 시험 감독  (0) 2022.04.28