[Python, 백준/21606번] 아침 산책

2024. 10. 7. 15:48·코테/백준


☑️ [Python, 백준/21606번] 아침 산책

1️⃣ 문제

문제 링크 : https://www.acmicpc.net/problem/21606

 

2️⃣ 접근

다른 정글 동료들에 비해서 이 문제를 늦게 접하게 된 편이었다. 문제의 난이도를 전해 들었어서 개인적으로 기대하고 있던 문제였는데, 조금 이전의 기억이라 정확하게 기억이 나지는 않지만, 5시간 정도를 투자해서 풀 수 있던 것 같다. 코치님들이 항상 어려운 문제는 30분을 고민하고 해답을 보고 다시 풀어보라고 말씀하셨었는데, 풀 수 있을 것 같은 느낌이 들어서 계속 붙잡고 있었다.

 

이 문제는 다른 블로그 포스팅과 AI를 보지 않고 풀어냈다는 점에서 기분이 좋았다.

 

처음에는 아래와 같이 접근했다.

# import sys
# from collections import deque
# sys.stdin = open('input.txt', 'r')
# sys.setrecursionlimit(10**6)

# def bfs() -> int:
#     q = deque()
#     answer = 0
    
#     for i in range(1, n_count + 1):
#         visit = [False] * (n_count + 1)
        
#         if n_type[i - 1] == '0':
#             continue

#         visit[i] = True
#         q.append(i)
        
#         while q:
#             curr_node = q.popleft()
#             visit[curr_node] = True
#             for adj_node in graph[curr_node]:
#                 if visit[adj_node] == False:
#                     if n_type[adj_node - 1] == '1':
#                         answer += 1
#                     else:
#                         q.append(adj_node)
#     return answer

# if __name__ == '__main__':
#     n_count = int(input())
#     n_type = input()

#     graph = [[] for _ in range(n_count+1)]

#     for _ in range(n_count - 1):
#         a, b = map(int, sys.stdin.readline().split())
#         graph[a].append(b)
#         graph[b].append(a)
    
#     print(bfs())

 

그래프를 만들어서 모든 Node를 순회하면서 인접 노드를 카운팅해줬다. 이렇게 작성하니까 점수가 60점이 나와서 문제를 조금 더 주의 깊게 살펴봤다.

 

Graph를 만들면서 어떻게 답을 구할 수 있을지 찾아봤는데, 실내 공간과 실내 공간이 이어지지 않은 Graph에 한해서 정답이 (실외노드와 인접한 실내 노드 수) x ((실외노드와 인접한 실내 노드 수) -1)임을 발견했고 실내 공간과 실내 공간은 처음 Grpah를 만들 때 +2를 더해줌으로서 처리할 수 있었다.

 

자세히 적고 싶은데, 기억나는게 이정도라서.. 확실히 알고리즘은 풀면서 생각을 정리하고 풀자마자 다시 한 번 정리하는게 중요하겠다.

 

3️⃣ 코드

import sys
from collections import deque
sys.setrecursionlimit(10**6)

def bfs() -> int:
    q = deque()
    indoor = 0
    sum = 0
    visit = [False] * (n_count + 1)
    
    # 전체 순회
    for i in range(1, n_count + 1):
        # 방문 여부 초기화 -> 새로운 노드가 돈다면
        # 실내일 경우 제외한다.
        if n_type[i - 1] == '1' or visit[i]:
            continue
        
        q.append(i)
        
        while q:
            cur_node = q.popleft()
            if n_type[cur_node - 1] == '0':
                visit[cur_node] = True
                
            # 인접 노드 확인
            for adj in graph[cur_node]:
                if visit[adj]:
                    continue
                
                if n_type[adj - 1] == '1':
                    sum += 1
                elif n_type[adj - 1] == '0':
                    q.append(adj)

        if sum <= 1:
            sum = 0
        indoor += sum * (sum - 1)
        sum = 0
    return indoor
                
if __name__ == '__main__':
    answer = 0
    n_count = int(input())
    n_type = input()

    graph = [ [] for _ in range(n_count+1)]

    for _ in range(n_count - 1):
        a, b = map(int, sys.stdin.readline().split())
        graph[a].append(b)
        graph[b].append(a)
        
        if n_type[a - 1] == n_type[b - 1] == '1':
            answer += 2
    print(bfs() + answer)

'코테 > 백준' 카테고리의 다른 글

[Python, 2252번] 줄 세우기  (4) 2024.10.09
[Python, 10844번] 쉬운 계단 수  (0) 2024.10.08
[Python, 백준/11725번] 트리의 부모 찾기  (1) 2024.09.24
[Python, 백준/2606번] 바이러스  (2) 2024.09.24
[Python, 백준/11724번] 연결 요소의 개수  (0) 2024.09.24
'코테/백준' 카테고리의 다른 글
  • [Python, 2252번] 줄 세우기
  • [Python, 10844번] 쉬운 계단 수
  • [Python, 백준/11725번] 트리의 부모 찾기
  • [Python, 백준/2606번] 바이러스
태역
태역
  • 태역
    RYULAB
    태역
  • 전체
    오늘
    어제
    • 분류 전체보기
      • 언어
        • C
        • C++
        • C#
      • 엔진, 프레임워크
        • Unity
        • Unreal
        • Electron
      • 공부
        • 디자인 패턴
        • 수학
        • CS
        • Git
        • 알고리즘
        • 자료구조
      • 코테
        • 프로그래머스
        • 백준
      • 독서
        • Effective C#
        • CLR via C#
        • 뇌를 자극하는 윈도우즈 시스템 프로그래밍
        • 오브젝트
        • CSAPP
        • OSTEP
      • 프로젝트
        • Unity
      • 개발 일지
        • 퓨처리티
        • 골든타임
      • 활동
        • 게임잼 후기
        • 게임제작동아리 브릿지
        • 크래프톤 정글
        • 기타
      • 기타
  • 블로그 메뉴

    • 링크

    • 공지사항

      • 2024 04 17
    • 인기 글

    • 태그

      오블완
      티스토리챌린지
      인프런 #인프런강의후기 #게임개발 #게임개발강의 #인강후기 #강의후기 #게임개발자 #인프런강의
    • 최근 댓글

    • 최근 글

    • hELLO· Designed By정상우.v4.10.3
    태역
    [Python, 백준/21606번] 아침 산책
    상단으로

    티스토리툴바