자료ꡬ쑰/πŸ‘‰μ•Œκ³ λ¦¬μ¦˜ - 19

였늘 듀은 κ°•μ˜ λͺ©λ‘

  1. dfs
  2. 그리디 - 1

DFS(깊이 μš°μ„  탐색)

dfsλŠ” ν•œμͺ½ λ°©ν–₯으둜 깊게 νƒμƒ‰ν•˜κ³ ,
λκΉŒμ§€ κ°„ 후에 λ‹€μ‹œ μ΄μ „λ…Έλ“œλ‘œ λŒμ•„κ°€μ„œ ν•΄λ‹Ή λ…Έλ“œμ˜ λ‹€λ₯Έ μžμ‹μ˜ λκΉŒμ§€ νƒμƒ‰ν•˜λŠ” 것을 κ³„μ†ν•΄μ„œ λ°˜λ³΅ν•œλ‹€.

λ”°λΌμ„œ, bfsμ™€λŠ” λ‹€λ₯΄κ²Œ stackλ₯Ό μ‚¬μš©ν•œλ‹€.

DFS κ΅¬ν˜„

κ·Έλž˜ν”„

μœ„ κ·Έλž˜ν”„λ₯Ό κ΅¬ν˜„ν•˜κ³ , dfs μˆœμ„œλŠ” 쑰금 λ‹€λ₯΄λ‹€.(였λ₯Έμͺ½λΆ€ν„° μ‹œμž‘)

def DFS(graph, start):
    visited = {node : False for node in graph}
    s = [start]
    visited[start] = True
    while s:
        cur_node = s.pop()
        print(cur_node)
        for node in graph[cur_node]:
            if not visited[node]:
                visited[node] = True
                s.append(node)
        print("next : ", end="")
        for e in s:
            print(e, end=" ")
        print()
DFS(graph, 'A')

μœ„ μ½”λ“œλŠ” BFSμ½”λ“œμ—μ„œ 큐만 μŠ€νƒμœΌλ‘œ λ°”κΎΌ μ½”λ“œλ‹€.

dfs

μœ„ κ·Έλ¦Όμ—μ„œ nextλŠ” μŠ€νƒμ„ μ˜λ―Έν•œλ‹€.

Aμ—μ„œ 탐색을 μ‹œμž‘ν•  것이기에 μŠ€νƒμ— Aμ‚½μž…ν•˜κ³  μ‹œμž‘ν•˜κ² λ‹€. μŠ€νƒ : A
μŠ€νƒμ—μ„œ νŒμ„ 톡해 얻은 λ…Έλ“œ A의 μΈμ ‘λ…Έλ“œλ“€μ„ μŠ€νƒμ— λ„£μœΌλ©΄, μŠ€νƒ : B, C
μŠ€νƒμ—μ„œ νŒμ„ 톡해 얻은 λ…Έλ“œ C의 μΈμ ‘λ…Έλ“œλ“€μ„ μŠ€νƒμ— λ„£μœΌλ©΄, μŠ€νƒ : B, G, H, I
μŠ€νƒμ—μ„œ νŒμ„ 톡해 얻은 λ…Έλ“œ I의 μΈμ ‘λ…Έλ“œλ“€μ„ μŠ€νƒμ— λ„£μœΌλ©΄, μŠ€νƒ : B, G, H, J
μŠ€νƒμ—μ„œ νŒμ„ 톡해 얻은 λ…Έλ“œ J의 μΈμ ‘λ…Έλ“œλ“€μ„ μŠ€νƒμ— λ„£μœΌλ©΄, μŠ€νƒ : B, G, H
μŠ€νƒμ—μ„œ νŒμ„ 톡해 얻은 λ…Έλ“œ H의 μΈμ ‘λ…Έλ“œλ“€μ„ μŠ€νƒμ— λ„£μœΌλ©΄, μŠ€νƒ : B, G
μŠ€νƒμ—μ„œ νŒμ„ 톡해 얻은 λ…Έλ“œ G의 μΈμ ‘λ…Έλ“œλ“€μ„ μŠ€νƒμ— λ„£μœΌλ©΄, μŠ€νƒ : B
μŠ€νƒμ—μ„œ νŒμ„ 톡해 얻은 λ…Έλ“œ B의 μΈμ ‘λ…Έλ“œλ“€μ„ μŠ€νƒμ— λ„£μœΌλ©΄, μŠ€νƒ : D
μŠ€νƒμ—μ„œ νŒμ„ 톡해 얻은 λ…Έλ“œ D의 μΈμ ‘λ…Έλ“œλ“€μ„ μŠ€νƒμ— λ„£μœΌλ©΄, μŠ€νƒ : E, F
μŠ€νƒμ—μ„œ νŒμ„ 톡해 얻은 λ…Έλ“œ F의 μΈμ ‘λ…Έλ“œλ“€μ„ μŠ€νƒμ— λ„£μœΌλ©΄, μŠ€νƒ : E
μŠ€νƒμ—μ„œ νŒμ„ 톡해 얻은 λ…Έλ“œ E의 μΈμ ‘λ…Έλ“œλ“€μ„ μŠ€νƒμ— λ„£μœΌλ©΄, μŠ€νƒ :
μŠ€νƒμ΄ λΉ„μ—ˆμœΌλ―€λ‘œ μ’…λ£Œ.

그리디(Greedy algorithm, νƒμš• μ•Œκ³ λ¦¬μ¦˜)

졜적의 해에 κ°€κΉŒμš΄ 값을 κ΅¬ν•˜κΈ° μœ„ν•¨
λ§€μˆœκ°„ ν•΄λ₯Ό 선택해야 ν• λ•Œλ§ˆλ‹€, 졜적의 ν•΄λ₯Ό κ³ λ₯΄λŠ” 방식이닀.

맀 μˆœκ°„ μ£Όμ–΄μ§€λŠ” 선택지듀 쀑 κ°€μž₯ 쒋은 선택지λ₯Ό κ³ λ₯Έλ‹€.

λ™μ „λ¬Έμ œ

μ§€λΆˆν•΄μ•Όν•˜λŠ” 값이 7230원 일 λ•Œ, 1원 50원 100원 500원 λ™μ „μœΌλ‘œ λ™μ „μ˜ μˆ˜κ°€ κ°€μž₯ 적도둝 μ§€λΆˆν•˜λŠ” 방법

  1. λ™μ „μ˜ μˆ˜κ°€ κ°€μž₯ 적게 ν•˜κΈ° μœ„ν•΄μ„œλŠ” β€œλ§€ μˆœκ°„ μ§€λΆˆν•  수 μžˆλŠ” 동전듀 쀑 κ°€μž₯ 큰 값을 가진 λ™μ „μœΌλ‘œ μ§€λΆˆβ€ν•˜λ©΄ λœλ‹€.
def coin(cost, values):
    values.sort()
    values.reverse()
    cnt = 0
    for value in values:
        cnt += cost // value
        cost = cost % value
    return cnt
coin(4720, [500, 100, 50, 1])
  1. μ‚¬μš© κ°€λŠ₯ν•œ 동전듀 쀑 κ°€μž₯ 큰 κ°’λΆ€ν„° 선택
  2. μ„ νƒν•œ λ™μ „μœΌλ‘œ μ΅œλŒ€ν•œ μ§€λΆˆ

coin

λ§ˆμ§€λ§‰

μˆ˜κ°•

λŒ“κΈ€λ‚¨κΈ°κΈ°