-
[CodeTree/Python] 연결된 칸 찾기Solve 2024. 6. 8. 13:07
문제
더보기연결된 칸 찾기
n x n 크기의 표에서 각 칸에 0또는 1의 값이 주어져 있습니다.
1이 주어진 칸끼리 변을 공유하고 있다면 그 칸은 연결되어있다고 합니다.
연결된 가능한 많은 수의 칸들의 개수를 모두 구하여, 각 개수를 오름차순으로 출력하는 프로그램을 작성해보세요.
입력 형식
첫 번째 줄에는 n이 주어집니다,
두 번째 줄부터 n개의 줄에 걸쳐 n개의 0또는 1이 공백을 두고 주어집니다.
- 5 ≤ n ≤ 25
출력 형식
첫 번째 줄에는 연결된 칸들이 모인 집합의 개수를 출력합니다.
두 번째 줄 부터 여러 개의 줄에 걸쳐 오름차순으로 각 집합에 속한 칸에 개수를 출력합니다.
해결
다음 내용을 고려하여 코드를 작성하였다.
- 탐색 과정에서 2차원 맵을 벗어나는 경우, False를 반환
- 방문 노드의 값이 1이고 방문 처리가 되지 않은 경우: 해당 노드 카운트 및 방문 처리 후 상하좌우 방향으로 재귀 탐색, 카운트 추가
- 맵 전체 좌표에서 해당 함수를 반복(띄엄띄엄 있는 덩어리를 찾기 위함)
- 방문 노드의 값이 1이고 방문 처리가 되지 않은 경우를 시작점으로 체크하며, 덩어리 노드 개수의 카운트 1 추가
- 함수에서 리턴 값을 카운트로 받았으므로, 재귀 함수를 돌면서 사이즈 리스트에 카운트값 추가
n = int(input()) # 2차원 리스트 맵 생성 graph = [] for i in range(n): graph.append(list(map(int, input().split()))) # 방문 처리를 위한 리스트 생성 visit = [] for i in range(n): visit.append([False] * n) # 2차원 맵 내에서의 재귀함수 생성 def dfs(x, y): # 주어진 범위를 벗어나는 경우, 즉시 종료 if x <= -1 or x >= n or y <= -1 or y >= n: return False # 현재 노드가 1이고, 해당 노드를 방문하지 않았을 시 방문 처리 if graph[x][y] == 1 and visit[x][y] == False: visit[x][y] = True # 상하좌우 위치 모두 재귀적으로 호출하면서 노드 개수 함께 카운트 count = 1 # 현재 노드 count += dfs(x - 1, y) count += dfs(x, y - 1) count += dfs(x + 1, y) count += dfs(x, y + 1) return count return False ans = 0 size = [] for i in range(n): for j in range(n): if graph[i][j] == 1 and visit[i][j] == False: ans += 1 # 시작점 체크 size.append(dfs(i, j)) # dfs 함수 돌면서 사이즈 리스트에 추가 print(ans) size.sort() # 각 개수를 오름차순으로 정렬 for i in size: print(i)
오름차순으로 정렬 안 해서 한 번 틀림
'Solve' 카테고리의 다른 글
[CodeTree/Python] 확산4 (0) 2024.06.17 [CodeTree/Python] n x m 표 이동 5 (0) 2024.06.11 [CodeTree/Python] 정육각형으로 이루어진 배열 (0) 2024.06.08 [CodeTree/Python] 연결된 그래프 2 (0) 2024.06.07 [CodeTree/Python] 연결된 그래프 (0) 2024.06.07