ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 16724. [Python]피리 부는 사나이
    Python_알고리즘/Gold III 2024. 7. 9. 05:15

    1. 문제

     

    https://www.acmicpc.net/problem/16724

     

     

    2. 접근 방법

     

    • 시간 제한: 1초
    • 메모리 제한: 256MB
    • DFS(깊이 우선 탐색)
    • 스택

     

    3. 파이썬 코드

     

    import sys
    
    input = sys.stdin.readline
    # 방향 배열 탐색
    def DFS(index):
        # 몇번째 DFS진행인지 체크
        global safe_cnt
        stack = [index]
        while stack:
            check = stack.pop()
            # 다음 위치를 dictionary를 통해서 받아옴
            next = direction[matrix[check[0]][check[1]]]
            # 다음 위치 갱신
            ny = next[0] + check[0]
            nx = next[1] + check[1]
            # 현재 위치 safe_cnt 변수로 체크
            answer[check[0]][check[1]] = safe_cnt
            # 다음 위치가 가지 않았을 경우 스택에 추가
            if answer[ny][nx] == -1:
                stack.append((ny,nx))
        # 반복문이 끝난 후 answer라는 위치체크 배열에서 ny,nx 값과 마지막으로 뽑은 check 값을 비교하여 같은 사이클인지 체크
        # 같은 사이클인 경우 1이라는 값을 반환해줌
        if answer[ny][nx] == answer[check[0]][check[1]]:
            return 1
        # 다른 사이클의 경우 0 을 반환
        else:
            return 0
    
    N, M = map(int,input().split())
    
    matrix = [ list(map(str,input())) for _ in range(N)]
    answer = [ [-1] * (M) for _ in range(N) ]
    
    direction = {
        "D" : (1, 0),
        "L" : (0, -1),
        "R" : (0, 1),
        "U" : (-1, 0)
    }
    
    safe_cnt = 0
    cnt = 0
    for i in range(N):
        for j in range(M):
            # 방문 했는지 안했는지 -1로 체크
            if answer[i][j] == -1:
                # 방문 안했으면 DFS를 돌린 후 check값을 cnt에 더해줌 ( 같은 사이클의 경우 안전영역 체크로 1을 더해줌 )
                check = DFS((i,j))
                cnt += check
                safe_cnt += 1
    print(cnt)

     

    4. 문제를 풀고난 후 생각

     

    • 한번 DFS를 들어갔을 때 연관된 부분을 모두 탐색하는 방식으로 문제를 접근했다.
    • 불필요한 연산을 하지않기 위해 조건으로 방문 안했을 경우만 DFS를 실행해 주었고, DFS 탐색이 지났을 때 return 값을 통해서 Safe Area의 개수를 체크해주는 방식으로 문제를 해결했다.
    • 문제에서 영역을 나누는 방법에 대해서 많은 고민을 했었고, safe_cnt 라는 변수를 통해서 영역을 구분해주는 방법을 선택했다.

     

    5. 문제를 푸는데 도움이 되는 지식

     

    • DFS(깊이 우선 탐색)
    • 스택

    'Python_알고리즘 > Gold III' 카테고리의 다른 글

    16235. [Python]나무 재테크  (10) 2024.09.27
    1520. [Python]내리막길  (0) 2024.09.24
    1937. [Python]욕심쟁이 판다  (1) 2024.09.20
    1695. [Python]팰린드롬 만들기  (0) 2024.07.04
    17299. [Python] 오등큰수  (0) 2023.09.01

    댓글

Designed by Tistory.