https://www.acmicpc.net/problem/2667
2667번: 단지번호붙이기
<그림 1>과 같이 정사각형 모양의 지도가 있다. 1은 집이 있는 곳을, 0은 집이 없는 곳을 나타낸다. 철수는 이 지도를 가지고 연결된 집의 모임인 단지를 정의하고, 단지에 번호를 붙이려 한다. 여
www.acmicpc.net
나의 코드
def bfs(x, y):
global number
global house_num
q.append([x, y])
visited[x][y] = 1
house_num = 1
while q:
a, b = q.pop(0)
for k in range(4):
ni = a + di[k]
nj = b + dj[k]
if 0 <= ni < N and 0 <= nj < N and arr[ni][nj] == 1 and visited[ni][nj] == 0:
visited[ni][nj] = 1
house_num += 1 # 방문한 집의 수 1 더함
q.append([ni, nj])
number += 1 # 이어진 집들 다 돌아서 단지 수 1 더함
house_num_list.append(house_num) # 방문한 집의 수 총 합을 리스트에 저장
return
N = int(input())
arr = [list(map(int, input())) for _ in range(N)]
visited = [[0]*N for _ in range(N)]
number = 0
house_num = 1
q = []
house_num_list = []
di = [0, 1, 0, -1]
dj = [1, 0, -1, 0]
for i in range(N):
for j in range(N):
if arr[i][j] == 1 and visited[i][j] == 0:
bfs(i, j) # 방문하지 않은 집을 시작으로 함수 실행
print(number)
house_num_list.sort() # 단지 내 집의 수 오름차순으로 정렬
for k in house_num_list:
print(k)
결과

bfs의 템플릿도 어느정도 알겠고 문제에서 요구하는 바도 처음부터 잘 읽어보고 풀어봤더니 바로 성공!! 알고리즘 정체기라고 생각했는데 열심히 할 원동력이 생겼다!ㅎㅎㅎ
'스터디 1일 1커밋' 카테고리의 다른 글
| 240320 [BOJ/백준] 1991. 트리 순회 (1) | 2024.03.21 |
|---|---|
| 240319 [BOJ/백준] 1713. 후보 추천하기 (0) | 2024.03.19 |
| 240318 [BOJ/백준] 31575. 도시와 비트코인 (2) | 2024.03.19 |
| 240315 [BOJ/백준] 14501. 퇴사 (0) | 2024.03.15 |
| 240314 [BOJ/백준] 1092. 배 (0) | 2024.03.14 |