본문 바로가기
백준 & 프로그래머스

백준.단지번호붙이기.2667.py

by concho 2023. 9. 20.

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

 

2667번: 단지번호붙이기

<그림 1>과 같이 정사각형 모양의 지도가 있다. 1은 집이 있는 곳을, 0은 집이 없는 곳을 나타낸다. 철수는 이 지도를 가지고 연결된 집의 모임인 단지를 정의하고, 단지에 번호를 붙이려 한다. 여

www.acmicpc.net

import sys
def solution(house_adr_dic):
    def adj_add(house_add): # return adj adr list
        x,y = house_add
        return [(x-1,y),(x+1,y),(x,y-1),(x,y+1)]
    
    def dfs_set(node_dic): # dfs 알고리즘
        tm_keys, adj_adr_list_set = set(node_dic.keys()), []
        
        while tm_keys:
            visted_set, vist_stack = set(), []
            vist_stack.append(tm_keys.pop()) # 주소 중 하나를 start로
            while vist_stack:
                now_adr = vist_stack.pop()
                if now_adr not in visted_set: # 집합 탐색=> O(1)
                    visted_set.add(now_adr)
                    tm_keys.discard(now_adr) #remove 할때 없어도 오류 안나는거 까먹음
                    vist_stack.extend(node_dic[now_adr]) # 인접 주소 저장
            adj_adr_list_set.append(len(visted_set))
        return adj_adr_list_set

    house_adj_adr_dic = dict() # key = 집 주소, value = 인근 집 주소 list
    for house_adr in house_adr_dic:
        adj_list = adj_add(house_adr)
        tm_adr_list = []
        for i in range(4): # 인접한 house add list를 만드는 과정
            if house_adr_dic.get(adj_list[i],False): tm_adr_list.append(adj_list[i]) # house adr value is T or F
        house_adj_adr_dic[house_adr] = tm_adr_list

    return dfs_set(house_adj_adr_dic) # 연결된 집 개수 들의 리스트를 반환

if __name__ == '__main__':
    house_adr_dic = dict()
    n = int(sys.stdin.readline().rstrip())
    for y in range(n):
        tm_string = sys.stdin.readline().rstrip()
        for x,h in enumerate(tm_string):
            if h == '1':
                house_adr_dic[(x,y)] = True

    house_adr_list = sorted(solution(house_adr_dic))
    print(len(house_adr_list))
    for h_set in house_adr_list: print(h_set)

'백준 & 프로그래머스' 카테고리의 다른 글

백준.듣보잡.1764.py  (0) 2023.09.21
백준.멀티탭 스캐줄링.1700.py  (0) 2023.09.20
백준.ATM.11399.py  (0) 2023.09.19
백준.일곱 난쟁이.2309.py  (0) 2023.09.19
백준.적록색약.10026.py  (0) 2023.09.19

댓글