[백준] 2667번 python : 단지번호붙이기

2021. 6. 3. 19:04발돋움/알고리즘

728x90
반응형

n = int(input())
apt = [list(map(int, list(input()))) for _ in range(n)]
v = [[0] * n for _ in range(n)]
dx = [1, -1, 0, 0] # X좌표 동서남북
dy = [0, 0, 1, -1] # Y좌표 동서남북

def dfs(i, j):
	global citizen
	citizen += 1 # 단지별로 연결된 것들을 카운트
	v[i][j] = 1
	for index in range(4):
		dj, di = j + dx[index], i + dy[index]
		if (0 <= di < n) and (0 <= dj < n): # 인덱스 범위를 안넘는다면
			if (v[di][dj] == 0) and (apt[di][dj] == 1): # 1이면서 방문하지 않은 것
				dfs(di, dj)

cnt = 0
cityl = []
for i in range(n):
	for j in range(n):
		if (apt[i][j] == 1) and (v[i][j] == 0):
			cnt += 1 # 단지 카운트
			citizen = 0
			dfs(i, j)
			cityl.append(citizen)

cityl.sort()
print(cnt)
for i in range(cnt):
	print(cityl[i])

인접리스트만 쓰다가 이렇게 행렬형태로 되어있는건 처음 풀어보는데 재밌다.

연결요소의 갯수를 출력하고 그 안에 연결요소별로 각각 1이 몇개가 있는지 한줄에 하나씩 출력해주면 된다.

해당 위치가 1이면서 방문하지 않은 것이 있다면 그 위치의 동서남북으로 1이면서 방문하지 않은 것을 찾아서 방문처리 해주면 된다.

이때 동서남북은 인덱스의 크기에서 벗어나면 안되기 때문에 코드에 조건을 걸어주면 된다.

인강의 코드보다 내 코드의 속도가 더 빠르게 나와서 뿌듯,,

그나저나 티스토리 왤케 글자가 안써지냐..짜증난다..ㅇㅠㅇ

 

728x90
반응형