ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [SWEA] 1949. 등산로 조성 (python)
    APS(Algorithm Problem Solving) 2021. 9. 16. 00:27

    문제 바로가기 : [모의 SW 역량 테스트] 탈주범 검거

     

    SW Expert Academy

    SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

    swexpertacademy.com

    문제 요약

    • 높은곳에서 낮은 곳으로 가로 또는 세로 방향으로 연결되는 최대 등산로의 길이를 구하는 문제
    • 최대 K만큼 한번 깎을 수 있다.
    def dfs(x, y, cnt, k_cnt):
        global max_cnt
        # 최댓값 갱신
        if max_cnt < cnt:
            max_cnt = cnt
        visited[y][x] = 1
        # 4방향 탐색 하면서
        for i in range(4):
            nx = x + dx[i]
            ny = y + dy[i]
            # 범위 내에 있으면 들어간다
            if 0 <= nx < N and 0 <= ny < N and visited[ny][nx] == 0:
                # 더 낮은 경우에만 들어가서 cnt값 +1 해줌
                if arr[ny][nx] < arr[y][x]:
                    visited[ny][nx] = 1
                    dfs(nx, ny, cnt+1, k_cnt)
                    visited[ny][nx] = 0
                # 같거나 높은 경우에
                else:
                    # K만큰 깎았을 때 지나갈 수 있는지 확인
                    if arr[ny][nx] - arr[y][x] < K:
                        # 깎을 수 있는 횟수가 남았다면
                        if k_cnt == 1:
                            a = arr[ny][nx] - arr[y][x] + 1
                            arr[ny][nx] -= a
                            visited[ny][nx] = 1
                            dfs(nx, ny, cnt+1, k_cnt-1)
                            visited[ny][nx] = 0
                            arr[ny][nx] += a
    
    
    T = int(input())
    for tc in range(1, T+1):
        N, K = map(int, input().split())
        arr = [list(map(int, input().split())) for _ in range(N)]
    
        # 4방향 탐색
        dx = [-1, 0, 1, 0]
        dy = [0, -1, 0, 1]
    
        # dfs를 시작할 가장 높은 값을 구한다.
        max_h = 0
    
        for i in range(N):
            for j in range(N):
                if arr[i][j] > max_h:
                    max_h = arr[i][j]
    
        max_cnt = 0
        # 깍을 수 있는 횟수
        k_cnt = 1
    
        for i in range(N):
            for j in range(N):
                if arr[i][j] == max_h:
                    visited = [[0] * N for _ in range(N)]
                    # 가장 높은 봉우리에서 bfs 시작
                    dfs(j, i, 1, 1)
    
        print('#{} {}'.format(tc, max_cnt))

    총평

    기본 bfs문제에서 딱 한가지 응용력을 요하는 문제.

    bfs의 흐름을 잘 이해한다면 어렵지 않게 풀 수 있는 문제인것 같다.

    'APS(Algorithm Problem Solving)' 카테고리의 다른 글

    [SWEA] 5644. 무선 충전 (python)  (1) 2021.08.29
Designed by Tistory.