본문 바로가기
스터디/알고리즘

단지번호 붙이기

by 세졍 2024. 3. 9.

 

 

문제이해
연결된 1의 덩어리 = 단지수 구하기
각 덩어리의 개수 = 집의 수 구하기

깊이 우선탐색(dfs)

1. 입력배열에서 1이고 방문배열이 0이면 거기서부터 단지수세어주고 dfs돌기

2. dfs돌면서 stack에 담아서 집의개수인 cnt 세어주기

3. 빈배열 lst 을 만들고 집의 개수=cnt담아서 오름차순정렬후 출력

 

 

 

 

실패코드

- apart배열에서 1인 수를 찾아 danji수를 셌는데 이러면 연결된 개수가 나오는게 아니라

그냥 apart배열에서 1의 총개수가 나옴 -> visited가 1인곳은  dangi수 세면 안됨X

N = int(input())
apart = [list(map(int,input())) for _ in range(N)]
visited = [[0]*N for _ in range(N)]
di = [-1,0,1,0]
dj = [0,1,0,-1]
# 깊이 우선 탐색(dfs) 사용해서 1이 연결된 개수 = 단지수 구하기 ,
# 각단지에서 1의 개수를 세서 lst에 담고 오름차순에서 순차적으로 출력

def dfs(x,y,apart,visited,N):
    stack = [(x,y)]
    cnt = 1
    while stack:
        (x,y) = stack[-1]
        for d in range(4):
            nx = x + di[d]
            ny = y + dj[d]
            if 0<=nx<N and 0<=ny<N and visited[nx][ny] == 0 and apart[nx][ny] == 1:
                stack.append((nx,ny))
                visited[nx][ny] = 1
                cnt += 1
                break
        else:
            stack.pop()

    lst.append(cnt)


danji = 0
lst = []
for i in range(N):
    for j in range(N):
        if apart[i][j] == 1:
            danji += 1
            visited[i][j] = 1
            dfs(i,j,apart,visited,N)

print(danji)
print(lst)

 

 

N = int(input())
apart = [list(map(int,input())) for _ in range(N)]
visited = [[0]*N for _ in range(N)]
di = [-1,0,1,0]
dj = [0,1,0,-1]
# 깊이 우선 탐색(dfs) 사용해서 1이 연결된 개수 = 단지수 구하기 ,
# 각단지에서 1의 개수를 세서 lst에 담고 오름차순에서 순차적으로 출력

def dfs(x,y,apart,visited,N):
    stack = [(x,y)]
    cnt = 1
    while stack:
        (x,y) = stack[-1]
        for d in range(4):
            nx = x + di[d]
            ny = y + dj[d]
            if 0<=nx<N and 0<=ny<N and visited[nx][ny] == 0 and apart[nx][ny] == 1:
                stack.append((nx,ny))
                visited[nx][ny] = 1
                cnt += 1
                break
        else:
            stack.pop()

    lst.append(cnt)

danji = 0
lst = []
for i in range(N):
    for j in range(N):
        if apart[i][j] == 1 and visited[i][j] == 0:
            danji += 1
            visited[i][j] = 1
            dfs(i,j,apart,visited,N)

print(danji)
lst.sort()
for i in lst:
    print(i)

'스터디 > 알고리즘' 카테고리의 다른 글

연결 요소의 개수  (0) 2024.03.10
카드2  (0) 2024.03.09
반복수열  (1) 2024.03.09
동적계획법(DP)  (0) 2024.03.07
순열사이클  (0) 2024.03.07