728x90
백준, 단지 번호 붙이기
🪴 문제
https://www.acmicpc.net/problem/2667
2667번: 단지번호붙이기
<그림 1>과 같이 정사각형 모양의 지도가 있다. 1은 집이 있는 곳을, 0은 집이 없는 곳을 나타낸다. 철수는 이 지도를 가지고 연결된 집의 모임인 단지를 정의하고, 단지에 번호를 붙이려 한다. 여
www.acmicpc.net
🪴 분류
pass
🪴 풀이
기본적인 dfs 문제로 풀면 된다.
상하좌우 1이고 방문한적 없는 경우 방문해줘야 한다.
방문표시를 하지 않을 경우 카운트할때 문제가 생길 뿐 아니라, 무한재귀에 빠질 수 있으니 방문표시를 해줘야 한다!
붙일 번호를 매개변수로 같이 넣어주는게 핵심!
최대한 상수 설정, global 설정해서 풀었다.
cnt 는 번호 붙일 번호이고, innerCnt는 1의 그룹별 갯수를 의미한다.
🪴 앞으로의 코드 변경 방향.
매개변수로 많이 넘길 경우 stack에 많이 쌓여 global 변수로 둘 수 있는 건 최대한 global 변수로 선언해줬다.
다음번 코드 변경할때는 함수, main나눠서 코드 작성하는 연습을 해야겠다.
🪴 나의 코드
N = int(input())
global maps
maps = []
for _ in range(N):
maps.append(list(map(int, list(input()))))
visited = [[False] * N for _ in range(N)]
global dr, dc, MAX_DIRECTION, R, C
MAX_DIRECTION = 4
dr = [-1, 0, 1, 0]
dc = [0, 1, 0, -1]
R, C = N, N
def dfs(cnt, cur_r, cur_c):
global maps, MAX_DIRECTION, innerCnt
innerCnt += 1
maps[cur_r][cur_c] = cnt
for i in range(MAX_DIRECTION):
next_r, next_c = cur_r+dr[i], cur_c+dc[i]
if 0<=next_r<R and 0<=next_c<C and not visited[next_r][next_c] and maps[next_r][next_c] == 1:
visited[next_r][next_c] = True
dfs(cnt, next_r, next_c)
cnt = 0
result = []
for r in range(R):
for c in range(C):
if not visited[r][c] and maps[r][c] == 1:
visited[r][c] = True
cnt +=1
global innerCnt
innerCnt = 0
dfs(cnt, r, c)
result.append(innerCnt)
print(cnt)
print(*sorted(result), sep='\n')
'알고리즘' 카테고리의 다른 글
프로그래머스, 섬 연결하기 (2) | 2023.12.05 |
---|---|
백준, 효율적인 해킹 (1) | 2023.11.26 |
프로그래머스, 표현 가능한 이진 트리 (0) | 2023.10.25 |
백준 17406 배열 돌리기 4 (1) | 2023.10.23 |
백준, 사다리 조작(combinations 활용) (0) | 2023.10.13 |