[백준] 14620번 꽃길 _ Python

2023. 11. 10. 13:10·Algorithms/Brute Fource

[초기 접근 방법]

 

- 처음에 '꽃들의 거리 > 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
'Algorithms/Brute Fource' 카테고리의 다른 글
  • [백준] 1548번 부분 삼각 수열 _ Python
  • [백준] 22944번 죽음의 비 _ Python
  • [백준] 12919번 A와 B 2 _ Python
  • 블로그 이전
wch_t
wch_t
  • wch_t
    끄적끄적(TIL)
    wch_t
  • 글쓰기 관리
  • 전체
    오늘
    어제
    • 분류 전체보기 (171)
      • Architecture (0)
      • Algorithm (67)
        • Math (5)
        • Simulation (1)
        • Data Structure (4)
        • DP (7)
        • Brute Fource (10)
        • Binary Search (6)
        • Greedy (2)
        • Graph (11)
        • Mst (1)
        • Shortest path (10)
        • Two Pointer (1)
        • Tsp (3)
        • Union Find (2)
        • Mitm (1)
      • CS (2)
        • 데이터베이스 (5)
        • 네트워크 (5)
      • DB (6)
      • DevOps (17)
        • AWS (9)
        • Docker (1)
        • CI-CD (5)
      • Error (1)
      • Project (0)
        • kotrip (0)
      • Spring (59)
        • 끄적끄적 (5)
        • 기본 (9)
        • MVC 1 (7)
        • MVC 2 (11)
        • ORM (8)
        • JPA 1 (7)
        • JPA 2 (5)
        • Spring Data Jpa (7)
      • Test (2)
      • TIL (6)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    Sxssf
    백준 17289 파이썬
    view algorithm
    백준 3015 파이썬
    Jenkins
    form_post
    apache poi
    spring-cloud-starter-aws-secrets-manager-config
    response_mode
    aws secrets manager
    백준 17299 파이썬
    scope
    spring-cloud-starter-bootstrap
    애플
    TempTable
    docker
    Merge
    docker: not found
  • 최근 댓글

  • hELLO· Designed By정상우.v4.10.3
wch_t
[백준] 14620번 꽃길 _ Python
상단으로

티스토리툴바