일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- SWEA 15612번
- 다이나믹프로그래밍
- AWS
- 백준 3085번
- 그리디
- 다이나믹 프로그래밍
- 백준 1253번
- 백준 18310번
- java_programming
- 백준 16918번
- 알고리즘
- 머신러닝과 딥러닝
- javascript
- 명품자바
- 백준 1987
- 백준
- 자바
- MySQL
- 백준 2512번
- 백준 15787번
- 백준 1331번
- 백준 17451번
- 깃헙
- react
- Python
- 모각코
- 그래프
- ubuntu
- SQL
- HUFS 모각코 캠프
Archives
- Today
- Total
차곡차곡
[BOJ/Python] 백준 14620번 - 꽃길 본문
백준 #14620 꽃길
import sys
input = sys.stdin.readline
sys.setrecursionlimit(10**6)
n = int(input()) # 화단 한 변 길이
garden = [list(map(int, input().split())) for _ in range(n)] # 화단 지점당 가격
def check(i, j, visited):
for dx, dy in (0, 1), (0, -1), (1, 0), (-1, 0), (0, 0):
x, y = i + dx, j + dy
if not ((0 <= x < n and 0 <= y < n) and visited[x][y]):
return False
return True
def calc(i, j):
cost = 0
for dx, dy in (0, 1), (0, -1), (1, 0), (-1, 0), (0, 0):
x, y = i + dx, j + dy
cost += garden[x][y]
return cost
def dfs(x, cnt, visited, cost_sum):
global min_cost
if cnt == 3:
min_cost = min(min_cost, cost_sum)
return
for i in range(x, n-1):
for j in range(1, n-1):
if check(i, j, visited):
for dx, dy in (0, 1), (0, -1), (1, 0), (-1, 0), (0, 0):
visited[i + dx][j + dy] = False
dfs(i, cnt+1, visited, cost_sum + calc(i, j))
for dx, dy in (0, 1), (0, -1), (1, 0), (-1, 0), (0, 0):
visited[i + dx][j + dy] = True
min_cost = sys.maxsize
dfs(1, 0, [[True for _ in range(n)] for _ in range(n)], 0)
print(min_cost)
백트래킹으로 쉽게 풀 수 있는 문제! 시간 복잡도를 넉넉하게 줘서 어렵지 않게 로직을 떠올릴 수 있었다. 다만, dfs 함수 내에서 틀린 게 좀 있어서 96퍼센트에서 계속 못 넘어갔음 😰
- 화단의 바깥 부분은 심을 수 없기 때문에 그 부분을 제외한 안쪽을 탐색한다.
- check 함수에서 꽃이 심어져있는지 여부를 표시하는 visited 리스트로 해당 위치에 꽃을 심을 수 있는지 확인한다.
- 심을 수 있는 경우 visited 리스트에 해당 위치에 꽃을 심었다고 표시한다. (이때 다섯 평 모두 표시됨)
- calc 함수로 해당 위치 비용을 계산하여 이전에 심었던 꽃들의 위치 비용들과 합해준다. (cost_sum)
- cnt로 현재 심은 꽃이 몇 개인지 표시하여 cnt가 3이 되었을 때 최소 비용을 갱신해준다.
- 재귀가 끝난 후 방문 처리 해제를 위해 False로 표시했던 visited를 다시 True로 변경한다.
'CS > Algorithm' 카테고리의 다른 글
[BOJ/Python] 백준 11048번 - 이동하기 (0) | 2022.08.08 |
---|---|
[BOJ/Python] 백준 2210번 - 숫자판 점프 (0) | 2022.08.06 |
[BOJ/Python] 백준 17451번 - 평행 우주 (0) | 2022.08.03 |
[BOJ/Python] 백준 1253번 - 좋다 (0) | 2022.08.03 |
[BOJ/Python] 백준 16918번 - 봄버맨 (0) | 2022.08.03 |
Comments