https://www.acmicpc.net/problem/2667

 

2667번: 단지번호붙이기

<그림 1>과 같이 정사각형 모양의 지도가 있다. 1은 집이 있는 곳을, 0은 집이 없는 곳을 나타낸다. 철수는 이 지도를 가지고 연결된 집의 모임인 단지를 정의하고, 단지에 번호를 붙이려 한다. 여

www.acmicpc.net

문제

<그림 1>과 같이 정사각형 모양의 지도가 있다. 1은 집이 있는 곳을, 0은 집이 없는 곳을 나타낸다. 철수는 이 지도를 가지고 연결된 집의 모임인 단지를 정의하고, 단지에 번호를 붙이려 한다. 여기서 연결되었다는 것은 어떤 집이 좌우, 혹은 아래위로 다른 집이 있는 경우를 말한다. 대각선상에 집이 있는 경우는 연결된 것이 아니다. <그림 2>는 <그림 1>을 단지별로 번호를 붙인 것이다. 지도를 입력하여 단지수를 출력하고, 각 단지에 속하는 집의 수를 오름차순으로 정렬하여 출력하는 프로그램을 작성하시오.

입력

첫 번째 줄에는 지도의 크기 N(정사각형이므로 가로와 세로의 크기는 같으며 5≤N≤25)이 입력되고, 그 다음 N줄에는 각각 N개의 자료(0혹은 1)가 입력된다.

출력

첫 번째 줄에는 총 단지수를 출력하시오. 그리고 각 단지내 집의 수를 오름차순으로 정렬하여 한 줄에 하나씩 출력하시오.


풀이

dfs로 풀었다!

python에서 vector는 방향과 크기를 가지는 단위라고 하는데 C++ 에서 정의해서 쓰는 Vector랑 뭔가 다른 느낌이라 헷갈린다.

전에는 상,하,좌,우를 분명하게 인지하고 가는게 중요하다고 생각했는데 그냥 사방을 검사하는거라면 굳이 상하좌우를 명확히 할 필요는 없는 것 같다

dfs로 탐색하고, 탐색이 끝나면 ans 에 1을 더한다.

각각의 크기는 hap을 통해 더하고 리스트에 넣어줬다. 그 이후 sort로 정렬 후 출력!

python 코드

# 2667 단지번호붙이기
dr = [0, 0, -1, 1]
dc = [-1, 1, 0, 0]

def dfs(i,j):
    global ans, hap
    visited[i][j] = 1
    for d in range(4):
        nr = i +dr[d]
        nc = j +dc[d]
        if nr >= 0 and nr < N and nc >= 0 and nc < N:
            if arr[nr][nc] == '1' and visited[nr][nc] == 0:
                hap += 1
                dfs(nr,nc)
    return

N = int(input())
arr = []
visited = [[0] * N for _ in range(N)]
ans = 0
ans_arr = []
for n in range(N):
    arr.append(list(input()))

for i in range(N):
    for j in range(N):
        hap = 0
        if arr[i][j] == '1' and visited[i][j] == 0:
            dfs(i,j)
            ans += 1
            ans_arr.append(hap)
print(ans)
ans_arr.sort()
for i in ans_arr:
    print(i+1)
반응형

+ Recent posts