백준[2667] - 단지번호붙이기
문제
2667번: 단지번호붙이기
<그림 1>과 같이 정사각형 모양의 지도가 있다. 1은 집이 있는 곳을, 0은 집이 없는 곳을 나타낸다. 철수는 이 지도를 가지고 연결된 집의 모임인 단지를 정의하고, 단지에 번호를 붙이려 한다. 여
www.acmicpc.net
작성한 코드
import sys
sys.setrecursionlimit(10**6)
input = sys.stdin.readline
N = int(input())
graph = [list(map(int, input().rstrip())) for _ in range(N)]
dx = [0, 0, -1, 1]
dy = [-1, 1, 0, 0]
cnt = 0
result = list()
def dfs(x, y):
global cnt
if x < 0 or x >= N or y < 0 or y >= N:
return False
if graph[x][y] == 1:
cnt += 1
graph[x][y] = 0
for i in range(4):
dfs(x+dx[i], y+dy[i])
return True
for i in range(N):
for j in range(N):
if dfs(i, j) == True:
result.append(cnt)
cnt = 0
result.sort()
print(len(result))
for i in result:
print(i)
- DFS, BFS 두 가지 방법 모두 사용해서 문제를 풀 수 있다. (나는 DFS로 풀어보았다. → 재귀함수 사용)
- N : (NxN) 지도 크기
- graph : N번 for문 돌리되, 한 줄씩 입력받는 내용은 각각 int형으로 형변환해서 list로 저장 (리스트 안에 리스트) → 1은 집O / 0은 집X
- 시작점이 정해져 있지X 떄문에 → 전체적으로 탐색해야 하며, 그러기 위해서는 방향벡터가 필요하다.
: 각 인덱스를 [상,하,좌,우] 라고 생각했을 때 → dx(x의 변화량) = [0, 0, -1, 1] / dy(y의 변화량) = [-1, 1, 0, 0]
- cnt : 단지 내 집의 개수
- result : 집의 개수 정보를 담을 리스트
- 만약 x, y 좌표 각각 0보다 작거나 N보다 크거나 같은 경우 → (NxN)보다 작거나 크다는 소리이기 때문에 성립X → False 반환
- graph[x][y] 값이 1일 경우 (집이 있을 경우) → True 반환
: cnt의 값을 1 증가시킨다.
: graph[x][y] = 0 → 탐색중인 위치를 0으로 바꿔 다시 방문하지 않도록 한다.
: 상하좌우(range(4)) 각 방향 별로 돌면서(x+dx[i] / y+dy[i]) 위의 로직을 다시 확인한다. (재귀함수)
- (NxN) 전체적으로 확인하기 위해 이중 for문을 돌린다.
: dfs(i, j)의 반환값이 True일 경우 → result에 cnt 값을 추가하고, cnt를 0으로 초기화 시킨다.
- result 내부 요소들을 오름차순으로 출력하기 위해서 sort()를 통해 오름차순으로 정렬해준다.
- 처음 출력해야 할 사항이 단지의 개수이기 때문에 → len(result)를 출력하고, for문을 돌면서 result 내부 요소를 한 줄씩 출력해준다.
'코딩테스트 > 백준' 카테고리의 다른 글
백준[2178] - 미로탐색 (0) | 2023.03.08 |
---|---|
백준[1012] - 유기농 배추 (0) | 2023.03.08 |
백준[1260] - DFS와 BFS (0) | 2023.03.04 |
백준[24479] - 알고리즘 수업 (너비 우선 탐색 2) (0) | 2023.02.28 |
백준[24444] - 알고리즘 수업 (너비 우선 탐색 1) (0) | 2023.02.28 |
댓글