[PY] 21606 : 아침 산책

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

실외 좀 다닐 것이지, 실내만 다니겠다고 애쓰면 비타민D 결핍이다.
어쨌든.. 기본적인 테스트 케이스가 되는걸 보고 눌렀는데 부분 채점 3점이 나와서

개선을 위해 조금 생각을 했다. 핵심은 이렇다.

첫째, 출발하는 노드가 실외일 수 없으니 실내인 경우만 dfs를 실시 할 수 있다.
둘째, 진행 할 노드가 실내라면 그렇구나~ 하고 경로 +1을 하고 넘어 갈 수 있다. 가능한 짧게 산책하려는 주인공 덕분이다.
셋째, 이게 문제다. 실외이면 스택에 넣어서 다음을 보도록 했는데, 실외 - 실외면 조금 귀찮아진다.
사실 기본적인 방문체크도 고려를 안했기 때문에.. 이거까지 넣으니 73점까지 확보를 했다.

무슨 말인지 모르겠다.. 좀만 천천히 하고싶다.

import sys
sys.setrecursionlimit(10**6)
caseCnt = int(sys.stdin.readline())
areaStatus = sys.stdin.readline()
edgeList = [[] for _ in range(caseCnt + 1)]
goAvailable = 0

for i in range(caseCnt - 1):
    
    start, dest = list(map(int, sys.stdin.readline().strip().split()))
    edgeList[start].append(dest)
    edgeList[dest].append(start)

def dfs(startVal):
    global goAvailable
    stack = []
    stack.append(startVal)
    visited = [False] * (caseCnt + 1)
    visited[startVal] = True

    while stack:
        item = stack.pop()
        for nextItem in reversed(edgeList[item]):
            if not visited[nextItem]:
                visited[nextItem] = True
                if areaStatus[nextItem - 1] == '0':
                    stack.append(nextItem)
                else:
                    goAvailable += 1
        


for i in range(1, caseCnt + 1):
    if(areaStatus[i - 1] == '0'):
        continue
    dfs(i)


print(goAvailable)

 

'문제풀이' 카테고리의 다른 글

[PY] 7569 : 토마토  (0) 2025.04.01
[PY] 2718 : 미로 찾기  (0) 2025.03.31
[PY] 11725 : 트리의 부모 찾기  (0) 2025.03.31
[PY] 2606 : 바이러스  (0) 2025.03.31
[PY] 11724 : 연결 요소의 갯수 (Union-Find)  (0) 2025.03.29