[초기 접근 방법]
- 처음에 '꽃들의 거리 > 2'를 생각하며 기하적으로 접근했다.
삼각형의 모든 변의 길이가 2 이상.. (오히려 더 복잡함)
[생각]
1. 오랜만에 풀어보는 완전 탐색 문제. 생각보다 오래 걸렸다..
2. 첫 코드에서 통과했지만 난잡하게 작성했던 코드를, 아래 블로그를 보면서 리팩토링을 했다.
[코드]
# 풀이 시간 : 1시간 30분
# 시간복잡도 : O(n^3)
# 공간복잡도 : O(n^2)
# 참고 : https://amor-fati.tistory.com/120
import sys
input = sys.stdin.readline
# 인근 5평 대여 비용 구하기
def calFive():
for i in range(1, N - 1):
for j in range(1, N - 1):
cost = ary[i][j]
for z in range(1, 5):
cost += ary[i + di[z]][j + dj[z]]
costAry[i][j] = cost
# 모든 꽃잎이 필 수 있는 상황인지 체크
def check(i, j):
for z in range(5):
ni = i + di[z]
nj = j + dj[z]
# 범위 바깥 or 이미 방문했을 경우
if not (0 <= ni < N and 0 <= nj < N) or visited[ni][nj]:
return False
# 다 필 수 있음
return True
# 꽃 3개가 정상적으로 필 때까지, 백트래킹 탐색
def dfs(flower, costSum):
global minCost
# 꽃 3개가 정상적으로 필 경우
if flower == 3:
minCost = min(minCost, costSum)
return
# 꽃잎이 피어나는 지역. 방문 처리
for i in range(1, N - 1):
for j in range(1, N - 1):
# 꽃이 정상적으로 필 경우
if check(i,j):
# 백트래킹 방문 처리
for z in range(5):
ni = i + di[z]
nj = j + dj[z]
visited[ni][nj] = True
result.append((i, j))
dfs(flower+1, costSum + costAry[i][j])
result.pop()
# 유효한 경로가 아닐 경우, 미방문 처리
for z in range(5):
ni = i + di[z]
nj = j + dj[z]
visited[ni][nj] = False
N = int(input())
ary = [list(map(int, input().split())) for _ in range(N)] # input 저장
costAry = [[0] * N for _ in range(N)] # cost[i][j] : 인근 5개의 구역 비용합
di = [0,-1,0,0,1]
dj = [0,0,-1,1,0]
visited = [[False] * N for _ in range(N)]
result = [] # 3개의 꽃 인덱스를 담을 리스트
minCost = float('inf')
calFive() # 5평 대여비용 구하기
dfs(0,0) # 3개의 꽃이 완전히 피어나는 경우 구하기
print(minCost)
'Algorithm > Brute Fource' 카테고리의 다른 글
[백준] 15721번 번데기 _ Python (1) | 2023.11.14 |
---|---|
[백준] 1548번 부분 삼각 수열 _ Python (0) | 2023.11.10 |
[백준] 22944번 죽음의 비 _ Python (0) | 2023.11.10 |
[백준] 12919번 A와 B 2 _ Python (0) | 2023.11.10 |
블로그 이전 (0) | 2023.11.10 |