[백준] 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
반응형
'발돋움 > 알고리즘' 카테고리의 다른 글
| 프로그래머스 K번째 수 (Python) (0) | 2021.12.08 |
|---|---|
| [백준] 2178번 python : 미로탐색 (0) | 2021.06.04 |
| [백준] 11724번 python : 연결요소의 갯수 (0) | 2021.06.03 |
| [백준] 1193번 (python 파이썬) 분수찾기 / [구름레벨] 뱀 유리수 수열 (0) | 2021.04.14 |
| [백준] 6603번 (python 파이썬) 로또 (0) | 2021.04.05 |