๐น ์ฝ๋ฉ ํ ์คํธ ๊ณต๋ถ
1. ๋ฌธ์  ๋งํฌ
2. ์ฝ๋
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
INF = int(1e9)
def solution(alp, cop, problems):
    problems.sort(key=lambda x : -x[0])
    min_alp = max(problems[0][0], alp)
    problems.sort(key=lambda x : -x[1])
    min_cop = max(problems[0][1], cop)
    
    dp = [[INF] * 151 for _ in range(151)]
    dp[alp][cop] = 0
    
    # ๊ณต๋ถ ์ด์ ์ ์ด๋ฏธ ๋ชจ๋  ๋ฌธ์  ํ ์ ์์ ๋
    if alp >= min_alp and cop >= min_cop:
        return 0
    
    def can_solve(now_alp, now_cop, p):
        a, c, ua, uc, cost = p
        return now_alp >= a and now_cop >= c
    
    def possible_alp_index(idx):
        if idx > min_alp:
            return min_alp
        else:
            return idx
        
    def possible_cop_index(idx):
        if idx > min_cop:
            return min_cop
        else:
            return idx
    
    for i in range(alp, min_alp + 1):
        for j in range(cop, min_cop + 1):
            # ์๊ณ ๋ฆฌ์ฆ์ ๊ณต๋ถํ์ฌ ์๊ณ ๋ ฅ 1 ์ฌ๋ฆฌ๊ธฐ
            alp_idx = possible_alp_index(i+1)
            dp[alp_idx][j] = min(dp[alp_idx][j], dp[i][j] + 1)
            # ์ฝ๋ฉ์ ๊ณต๋ถํ์ฌ ์ฝ๋ฉ๋ ฅ 1 ์ฌ๋ฆฌ๊ธฐ
            cop_idx = possible_cop_index(j+1)
            dp[i][cop_idx] = min(dp[i][cop_idx], dp[i][j] + 1)
            # ๋ฌธ์ ๋ฅผ ํ์ด ์๊ณ ๋ ฅ, ์ฝ๋ฉ๋ ฅ ์ฌ๋ฆฌ๊ธฐ
            for p in problems:
                a, c, ua, uc, cost = p
                if can_solve(i, j, p):
                    alp_idx, cop_idx = possible_alp_index(i+ua), possible_cop_index(j+uc)
                    dp[alp_idx][cop_idx] = min(dp[alp_idx][cop_idx], dp[i][j] + cost)
    
    return dp[min_alp][min_cop]
- ์ ํ์ฑ
| ํ ์คํธ 1 ใ | ํต๊ณผ (0.62ms, 10.4MB) | 
| ํ ์คํธ 2 ใ | ํต๊ณผ (0.66ms, 10.4MB) | 
| ํ ์คํธ 3 ใ | ํต๊ณผ (0.36ms, 10.4MB) | 
| ํ ์คํธ 4 ใ | ํต๊ณผ (0.19ms, 10.4MB) | 
| ํ ์คํธ 5 ใ | ํต๊ณผ (0.34ms, 10.4MB) | 
| ํ ์คํธ 6 ใ | ํต๊ณผ (0.43ms, 10.4MB) | 
| ํ ์คํธ 7 ใ | ํต๊ณผ (0.20ms, 10.3MB) | 
| ํ ์คํธ 8 ใ | ํต๊ณผ (0.20ms, 10.5MB) | 
| ํ ์คํธ 9 ใ | ํต๊ณผ (0.28ms, 10.4MB) | 
| ํ ์คํธ 10 ใ | ํต๊ณผ (0.19ms, 10.5MB) | 
- ํจ์จ์ฑ
| ํ ์คํธ 1 ใ | ํต๊ณผ (34.96ms, 10.4MB) | 
| ํ ์คํธ 2 ใ | ํต๊ณผ (30.26ms, 10.5MB) | 
| ํ ์คํธ 3 ใ | ํต๊ณผ (4.83ms, 10.5MB) | 
| ํ ์คํธ 4 ใ | ํต๊ณผ (23.22ms, 10.2MB) | 
| ํ ์คํธ 5 ใ | ํต๊ณผ (171.49ms, 10.4MB) | 
| ํ ์คํธ 6 ใ | ํต๊ณผ (40.59ms, 10.5MB) | 
| ํ ์คํธ 7 ใ | ํต๊ณผ (210.64ms, 10.4MB) | 
| ํ ์คํธ 8 ใ | ํต๊ณผ (162.95ms, 10.4MB) | 
| ํ ์คํธ 9 ใ | ํต๊ณผ (384.07ms, 10.3MB) | 
| ํ ์คํธ 10 ใ | ํต๊ณผ (5.62ms, 10.3MB) | 
3. ํด์ค
๋ฌธ์ ๋ฅผ ๋ชจ๋ ํ๊ธฐ ์ํด์๋ ๋ฌธ์ ๋ค ์ค ํ์ํ ์ต๋ ์๊ณ ๋ ฅ๊ณผ ์ต๋ ์ฝ๋ฉ๋ ฅ์ ๋ง์กฑํด์ผ ํ๋ค.
๊ฐ ์๊ณ ๋ ฅ๊ณผ ์ฝ๋ฉ๋ ฅ์ ๋๋ฌํ์ ๋์ ์ต์ ์๊ฐ์ dp์ ์ ์ฅํ๋ค.
โ โdp[์๊ณ ๋ ฅ][์ฝ๋ฉ๋ ฅ] = ๊ฑธ๋ฆฌ๋ ์ต์ ์๊ฐโ
์ฒ์ ์๊ณ ๋ ฅ, ์ฝ๋ฉ๋ ฅ์ผ ๋๋ 0์ผ๋ก ์ด๊ธฐํ ํด์ฃผ๊ณ ๋๋จธ์ง dp ๊ฐ์ ๋ฌดํ๋๋ก ์ค์ ํด์ค๋ค.
3๊ฐ์ง ๊ฒฝ์ฐ๋ก ์๊ณ ๋ ฅ, ์ฝ๋ฉ๋ ฅ์ ๋์ผ ์ ์๋ค.
- ์๊ณ ๋ฆฌ์ฆ ๊ณต๋ถ๋ฅผ ํ์ฌ ์๊ณ ๋ ฅ 1 ์ฌ๋ฆฌ๊ธฐ - โ dp[i+1][j] = min(dp[i+1][j], dp[i][j] + 1) 
- ์ฝ๋ฉ ๊ณต๋ถ๋ฅผ ํ์ฌ ์ฝ๋ฉ๋ ฅ 1 ์ฌ๋ฆฌ๊ธฐ - โ dp[i][j+1] = min(dp[i][j+1], dp[i][j] + 1) 
- ๋ฌธ์ ๋ฅผ ํ์ด ์๊ณ ๋ ฅ, ์ฝ๋ฉ๋ ฅ ์ฌ๋ฆฌ๊ธฐ - ๋ฌธ์ ๋ฅผ ํ์์ ๋ ์ค๋ฅด๋ ์๊ณ ๋ ฅ : ua - ๋ฌธ์ ๋ฅผ ํ์์ ๋ ์ค๋ฅด๋ ์ฝ๋ฉ๋ ฅ : uc - ๋ฌธ์ ๋ฅผ ํ์์ ๋ ๊ฑธ๋ฆฌ๋ ์๊ฐ : cost - โ dp[i+ua][j+uc] = min(dp[i+ua][j+uc], dp[i][j] + cost) 
๊ฐ ๊ฒฐ๊ณผ๋ฅผ dp์ ์ ์ฅํ๊ณ ์ด๋ ๋ชจ๋ ๋ฌธ์ ๋ฅผ ํ๊ธฐ ์ํ ์ต์ ์๊ฐ์ dp[๋ชฉํ ์๊ณ ๋ ฅ][๋ชฉํ ์ฝ๋ฉ๋ ฅ]์ด๋ค.
โญย ์ด๋ (์ฒ์ ์๊ณ ๋ ฅ, ์ฒ์ ์ฝ๋ฉ๋ ฅ)์ด (๋ชฉํ ์๊ณ ๋ ฅ, ๋ชฉํ ์ฝ๋ฉ๋ ฅ)๋ณด๋ค ํฐ ๊ฒฝ์ฐ์ ๋ ํฐ ๊ฐ์ ๋ชฉํ ๊ฐ์ผ๋ก ๋ณํํ๊ณ dp๊ฐ์ ์ด๊ธฐํํด์ผํ๋ค.
โญย dp์ ์๊ณ ๋ ฅ, ์ฝ๋ฉ๋ ฅ์ ์ธ๋ฑ์ค๋ก ์ ๊ทผํ ๋ ๋ชฉํ๋ฅผ ๋์ด๊ฐ๊ฑฐ๋ ์ ํด์ง ํฌ๊ธฐ๋ณด๋ค ๋ ํฐ ๊ฐ์ผ๋ก ์ ๊ทผํ ๊ฒฝ์ฐ ๋ฐํ์ ์๋ฌ๊ฐ ๋ฐ์ํ ์ ์๋ค. ๋ฐ๋ผ์ (๋ชฉํ ์๊ณ ๋ ฅ, ๋ชฉํ ์ฝ๋ฉ๋ ฅ)๋ณด๋ค ํฐ ์ธ๋ฑ์ค๋ก ์ ๊ทผํ ๊ฒฝ์ฐ๋ฅผ ๋ง๊ธฐ ์ํด ์ธ๋ฑ์ค๊ฐ ๋ ํด ๊ฒฝ์ฐ ๋ชฉํ ์๊ณ ๋ ฅ, ๋ชฉํ ์ฝ๋ฉ๋ ฅ์ผ๋ก ๋ฐ๊พธ์ด์ค ํ ๊ณ์ฐํ๋ค.