Solve
[CodeTree/Python] 연결된 칸 찾기
헨헨7
2024. 6. 8. 13:07
문제

더보기
연결된 칸 찾기
n x n 크기의 표에서 각 칸에 0또는 1의 값이 주어져 있습니다.
1이 주어진 칸끼리 변을 공유하고 있다면 그 칸은 연결되어있다고 합니다.
연결된 가능한 많은 수의 칸들의 개수를 모두 구하여, 각 개수를 오름차순으로 출력하는 프로그램을 작성해보세요.
입력 형식
첫 번째 줄에는 n이 주어집니다,
두 번째 줄부터 n개의 줄에 걸쳐 n개의 0또는 1이 공백을 두고 주어집니다.
- 5 ≤ n ≤ 25
출력 형식
첫 번째 줄에는 연결된 칸들이 모인 집합의 개수를 출력합니다.
두 번째 줄 부터 여러 개의 줄에 걸쳐 오름차순으로 각 집합에 속한 칸에 개수를 출력합니다.
코드트리 | 코딩테스트 준비를 위한 알고리즘 정석
국가대표가 만든 코딩 공부의 가이드북 코딩 왕초보부터 꿈의 직장 코테 합격까지, 국가대표가 엄선한 커리큘럼으로 준비해보세요.
www.codetree.ai
해결

다음 내용을 고려하여 코드를 작성하였다.
- 탐색 과정에서 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)
오름차순으로 정렬 안 해서 한 번 틀림