ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [λ°±μ€€] 14620 꽃길 with Python
    PS 2021. 12. 13. 21:18
    728x90
    λ°˜μ‘ν˜•

    πŸ“Œ BOJ 14620 꽃길

    πŸ’‘ 쑰건

    1. 꽃밭은 N * N 의 격자 λͺ¨μ–‘이고, 씨앗을 (1, 1) ~ (N, N)의 지점 쀑 ν•œκ³³μ— 심을 수 μžˆλ‹€.
      1λ…„ ν›„ μƒν•˜μ’Œμš°λ‘œ κ½ƒμžŽμ΄ νŽΌμ³μ§„λ‹€.
    2. μ–΄λ–€ 씨앗이 꽃이 ν•€ λ’€, λ‹€λ₯Έ κ½ƒμžŽ ν˜Ήμ€ κ½ƒμˆ κ³Ό λ‹Ώκ²Œ 될 경우 꽃이 λ‘˜ λ‹€ 죽어버린닀.
    3. μ„œλ‘œ λ‹€λ₯Έ μ„Έ 씨앗을 λͺ¨λ‘ 꽃이 ν”Όκ²Œν•˜λ©΄μ„œ κ°€μž₯ μ‹Ό 가격에 화단을 λŒ€μ—¬ν•˜λ €κ³  ν•œλ‹€.
      진아가 꽃을 심을 수 μžˆλŠ” μ΅œμ†ŒλΉ„μš©μ„ κ΅¬ν•˜λŠ” λ¬Έμ œμ΄λ‹€.
    4. ν•œ λ³€μ˜ 길이 N(6 ≀ N ≀ 10)
    5. ν™”λ‹¨μ˜ 지점당 가격(0 ≀ G ≀ 200)
    6. 브루트포슀 μ•Œκ³ λ¦¬μ¦˜ μœ ν˜•μ˜ 문제

    πŸ–₯ μ†ŒμŠ€ μ½”λ“œ

    from sys import stdin, setrecursionlimit
    setrecursionlimit(10 ** 9)
    
    n = int(stdin.readline())
    arr = []
    res = [int(1e9)]
    visited = set()
    dx, dy = [1, 0, 0, -1], [0, 1, -1, 0]
    
    for _ in range(n):
        arr.append(list(map(int, stdin.readline().split())))
    
    
    def solve(cnt, cost, v):
        if cnt == 3:
            res[0] = min(res[0], cost)
    
        else:
            for i in range(1, n - 1):
                for j in range(1, n - 1):
                    temp_visit = set()
                    temp_visit.add((i, j))
                    tf = 1
                    temp = arr[i][j]
                    for k in range(4):
                        nx, ny = i + dx[k], j + dy[k]
                        if -1 < nx < n and -1 < ny < n:
                            if (nx, ny) not in v:
                                temp += arr[nx][ny]
                                temp_visit.add((nx, ny))
                            else:
                                tf = 0
                                break
                        else:
                            tf = 0
                            break
    
                    if tf and temp_visit:
                        v.update(temp_visit)
                        solve(cnt + 1, cost + temp, v)
                        v -= temp_visit
    
    
    solve(0, 0, visited)
    print(*res)

    πŸ”– 예제 및 μ‹€ν–‰κ²°κ³Ό

    예제

    6
    1 0 2 3 3 4
    1 1 1 1 1 1
    0 0 1 1 1 1
    3 9 9 0 1 99
    9 11 3 1 0 3
    12 3 0 0 0 1

    μ‹€ν–‰κ²°κ³Ό

    12

    ⌨️ 문제 풀이

    1. DFS μ•Œκ³ λ¦¬μ¦˜μ„ μ‚¬μš©ν–ˆλ‹€.
    2. 심은 씨앗이 3κ°œκ°€ λ˜μ§€ μ•ŠμœΌλ©΄, 계속 씨앗을 심어쀀닀.
      전체 μ’Œν‘œλ₯Ό μˆœνšŒν•˜λ©΄μ„œ μž‘μ—…μ„ ν•œλ‹€. 씨앗을 심은 뢀뢄을 κΈ°μ€€μœΌλ‘œ μƒν•˜μ’Œμš°μ˜ μ’Œν‘œλ₯Ό visited 집합 μžλ£Œν˜•μ— λ„£μ–΄μ£Όμ–΄μ„œ,
      visited의 μ’Œν‘œλ“€μ—λ„ 씨앗을 심을 수 μ—†κ²Œ ν•œλ‹€.
    3. solve(심은 μ”¨μ•—μ˜ 갯수, 화단을 λΉŒλ¦¬λŠ” λΉ„μš©, κ½ƒμžŽμ΄ ν”Όμ–΄ 심을 수 μ—†λŠ” ꡬ역듀) 에 심은 μ”¨μ•—μ˜ 개수λ₯Ό ν•˜λ‚˜μ”© λŠ˜λ €μ€€λ‹€.
    4. 심은 씨앗이 3κ°œκ°€ λœλ‹€λ©΄ μ΅œμ†ŒλΉ„μš©μΈμ§€ ν™•μΈν•˜μ—¬ res 값에 μ €μž₯ν•œλ‹€.

    πŸ’Ύ λŠλ‚€μ 

    λ°˜μ‘ν˜•

    λŒ“κΈ€

Designed by Tistory.