728x90

# 출처 : https://www.acmicpc.net/problem/2667

 

2667번: 단지번호붙이기

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

www.acmicpc.net


# 풀이

 


# 코드

#상하좌우
dx, dy = [-1, 1, 0, 0], [0, 0, -1, 1]

def BFS(x, y):
    q=[(x, y)] #초기 위치 queue에 넣음
    visited[x][y]=True #초기 위치 방문했다고 표기(중요!-반례로 하나의 단지에 한 집만 있을 수 있으므로)
    count=1 #초기 위치 집 카운팅

    while q:
        x, y = q.pop(0) #초기 위치 기준으로 상하좌우 탐색
        for (i, j) in zip(dx, dy): #상하좌우 확인
            nx, ny = x+i, y+j #상하좌우
            if 0<= nx < N and 0<= ny < N and Arr[nx][ny]==1 and visited[nx][ny]==False: #범위를 넘지 않으면서, 집이 있고, 방문한 적이 없는 곳을 들림
                visited[nx][ny]=True #방문 했다고 표기
                q.append((nx, ny)) #큐에 넣음
                count+=1 #집 수 카운팅
    return count #총 집 수 반환

def main():
    global N, Arr, visited
    N = int(input())
    Arr = [list(map(int, input())) for _ in range(N)]

    num=[] #각 단지내 집의 수 담기
    cnt=0 #총 단지 수 세기
    visited=[[False]*N for _ in range(N)] #방문 확인
    for i in range(N):
        for j in range(N):
            if Arr[i][j] == 0: #집이 없는 곳은 확인할 필요 없음
                visited[i][j]=True #방문 했다고 치는 걸로
                continue
            if visited[i][j] == True: continue #방문한 곳은 방문할 필요 없으므로
            num.append(BFS(i ,j)) #집이 있으며, 방문하지 않은 곳을 탐색
            cnt+=1 #총 단지 수 카운팅
    
    print(cnt) #총 단지 수 출력
    for i in sorted(num): #오름 차순으로 정렬하여 출력
        print(i)

if __name__ == "__main__":
    main()
728x90

'algorithm > baekjoon' 카테고리의 다른 글

[BOJ] 1697 숨바꼭질 (python)  (0) 2021.09.29
[BOJ] 7576 토마토 (python)  (0) 2021.09.29
[BOJ] 2178 미로탐색 (python)  (0) 2021.09.29
[BOJ] 14502 연구소 (python)  (0) 2021.09.29
[BOJ] 16234 인구 이동 (java, python)  (0) 2021.08.16

+ Recent posts