[TIL_Carrotww] 109 - 23/04/25

μœ ν˜•μ„Β·2023λ…„ 4μ›” 25일
0

TIL

λͺ©λ‘ 보기
124/138
post-thumbnail

πŸ“Carrotww의 μ½”λ”© 기둝μž₯

🧲 python algorithm

πŸ” λ°±μ€€ ν‰λ²”ν•œ λ°°λ‚­

μ²˜μŒμ— dfs둜 일단 ν’€μ–΄λ΄€λ‹€.
μ‹œκ°„ μ΄ˆκ³Όκ°€ λ‚˜μ„œ 이거 dp λ¬Έμ œμΈκ°€ μ‹Άμ–΄μ„œ μ°Ύμ•„λ΄€λ‹€.
μ—­μ‹œ λ‚΄κ°€ μ•½ν•œ dp문제... κ²€μƒ‰ν•΄λ³΄λ‹ˆ μŠ€λƒ… λ­μ‹œκΈ°λΌκ³  ν•˜λŠ”λ° κ·Έλƒ₯ dp μ•„λ‹Œκ°€... μ‹Άμ—ˆλ‹€.

  • 풀이
def solve():
    import sys

    N, K = map(int, sys.stdin.readline().split())
    dp = [[0]*(K+1) for _ in range(N+1)]
    thing_list = [[0, 0]]
    for _ in range(N):
        thing_list.append(list(map(int, sys.stdin.readline().split())))

    for i in range(1, N+1):
        for j in range(1, K+1):
            w = thing_list[i][0]
            v = thing_list[i][1]

            if j < w:
                dp[i][j] = dp[i-1][j]
            else:
                dp[i][j] = max(dp[i-1][j], v+dp[i-1][j-w])

    print(dp[N][K])

if __name__ == "__main__":
    solve()

dp λ¬Έμ œλŠ” μ΄ν•΄ν•˜λ©΄ μ‰½μ§€λ§Œ κ·Έ μ „μ—λŠ” λ­”κ°€... μ‹Άλ‹€ μ†”μ§νžˆ 문제λ₯Ό 보고도 잘 생각이 λ‚˜μ§€ μ•ŠλŠ”λ‹€.
μ²˜μŒμ—λŠ” 그리디인가? dfs λ¬Έμ œμΈκ°€? μ‹Άμ—ˆλ‹€.
dp... 많이 ν’€μ–΄μ•Όκ² λ‹€.

πŸ” λ°±μ€€ 돌멩이 제거

μ •λ‹΅λ₯  λ†’μ•„μ„œ ν’€μ–΄λ³Έ ν”Œλ ˆ 문제인데 μ™œ μ •λ‹΅λ₯ μ΄ 높은지 μ•Œμ•˜λ‹€.
μ‰¬μ›Œμ„œκ°€ μ•„λ‹ˆλΌ 아무도 λͺ»ν’€μ–΄μ„œ κ·Έλƒ₯ λ‹΅ λΆ™μ—¬λ„£μ–΄μ„œ μ •λ‹΅λ₯ μ΄ 높은거닀.
μ²˜μŒμ— κ·Έλ¦¬λ””λ‘œ μƒκ°ν–ˆλŠ”λ° κ°€λ‘œ μ„Έλ‘œλ‘œμ–΄λ””λΆ€ν„° μ‹œμž‘ν•΄μ•Όν• μ§€ κ·Έκ±Έ λͺ¨λ₯΄κ² μ–΄μ„œ λ‚˜λ„ 검색을 ν•΄λ΄€λ‹€.
그런데 이 문제λ₯Ό ν’€κΈ°μœ„ν•΄μ„œλŠ”

  • μ΅œλŒ€ 이뢄 맀칭
  • μ΅œμ†Œ λ²„ν…μŠ€ μ»€μ„œ
  • μ½°λ‹ˆκ·Έμ˜ 정리

μœ„ 세가지λ₯Ό μ•Œμ•„μ•Ό ν’€ 수 있고 이해가 κ°€λŠ₯ν•˜λ‹€...
μ‹œκ°„μ΄ κ±Έλ €μ„œ 이해λ₯Ό ν•˜κΈ΄ ν–ˆλ‹€. 막상 μ΄ν•΄ν•˜λ©΄ μ΄ν•΄λŠ” λ˜λŠ”λ° μ‘μš© λ¬Έμ œκ°€ λ‚˜μ˜€λ©΄ ν’€ 수 μžˆμ„κΉŒ...?
μ½”ν…Œμ— 이런 λ¬Έμ œκ°€ λ‚˜μ˜¬κΉŒ? μ‹ΆκΈ°λŠ” ν•˜λ‹€.

  • 풀이
if __name__ == "__main__":
    import sys
    N, K = map(int, sys.stdin.readline().split())
    graph = {x:[] for x in range(1, N+1)}
    for _ in range(K):
        row, col = map(int, sys.stdin.readline().split())
        graph[row].append(col)

    matching = [False for _ in range(N+1)]

    def dfs(idx):
        if visited[idx]:
            return False
        visited[idx] = True

        for i in graph[idx]:
            idx_i = matching[i]
            if idx_i == False or dfs(idx_i) == True:
                matching[i] = idx
                return True
        return False

    result = 0
    for i in range(1, N+1):
        visited = [False for _ in range(N+1)]
        if dfs(i):
            result += 1

    print(result)
profile
Carrot_hyeong

0개의 λŒ“κΈ€