상세 컨텐츠

본문 제목

[Python] 백준 2667번 - 단지 번호 붙이기

STUDY/__Coding Test

by 2_54 2022. 1. 20. 00:05

본문

문제 링크 : 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)가 입력된다.

출력

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

 

예제 입력 : 

7
0110100
0110101
1110101
0000111
0100000
0111110
0111000

예제 출력 :

3
7
8
9

 

코드

dange_size = input()
dange = []
for i in range(int(dange_size)):
    input_data = input()
    dange.append(input_data)
flag = [[0]*int(dange_size) for _ in range(int(dange_size))]

num = 1
num_home_list = []
num_home = 1

def dfs(dange, j, k, flag, num_home):
    if k+1 != len(dange[0]) and dange[j][k + 1] == '1' and flag[j][k+1] == 0:  # 오른쪽이랑 비교
        flag[j][k+1] = 1
        num_home = dfs(dange, j, k+1, flag, num_home) + 1
    if k-1 != -1 and dange[j][k - 1] == '1' and flag[j][k-1] == 0: # 왼쪽이랑 비교
        flag[j][k-1] = 1
        num_home = dfs(dange, j, k-1, flag, num_home) + 1
    if j+1 != len(dange[0]) and dange[j + 1][k] == '1' and flag[j + 1][k] == 0: # 아래쪽이랑 비교
        flag[j + 1][k] = 1
        num_home = dfs(dange, j+1, k, flag, num_home) + 1
    if j-1 != -1 and dange[j - 1][k] == '1' and flag[j - 1][k] == 0: # 위쪽이랑 비교
        flag[j - 1][k] = 1
        num_home = dfs(dange, j - 1, k, flag, num_home) + 1
    return num_home

for x in range(int(dange_size)):
    for y in range(int(dange_size)):
        if dange[x][y] == '1' and flag[x][y] == 0:
            num_home = 1
            flag[x][y] = 1
            num_home = dfs(dange, x, y, flag, num_home)
            num_home_list.append(num_home)

num_home_list.sort()
print(len(num_home_list))
for a in range(len(num_home_list)):
    print(num_home_list[a])

 

+ 기억해두기

1. 2차원 배열 초기화 방법

flag = [[0]*int(dange_size) for _ in range(int(dange_size))]

2. if문 남발 x

무지성 코딩말고 

dx = [-1, 1, 0, 0]
dy = [0, 0, -1, 1]

을 사용해서

짧게 효율적으로 코딩하자!

 

+ TMI

나는 dfs로 구현하였다!

코딩테스트 문제를 처음 풀어봐서

그냥 무지성으로 코딩을 했다..

if문 남발ㅋㅋㅋㅋㅋㅋㅋㅋㅋ

 

처음에 예제 입력으로는 작동이 잘 되길래

제출했는데 계속 틀렸다고해서

 

알고리즘 스터디 오픈채팅방에 질문도 해서 알아냈다..

제한해둔 범위가 이상했다!

처음에는 x,y에서 y+1이 단지 크기와 같거나 넘어가면

그 다음 y+1을 탐색할 수 없기 때문에

out of range error가 떠서

x+1, y+1가 단지 크기와 같거나 넘어갈 수 없도록 했었다.

 

그래서 사이즈가 큰 단지의 경우에는 작동을 했지만

2

11

11

와 같이 작은 단지의 경우

탐색이 안되는 일이 발생했다ㅠ

 

그래서 !=로 수정했더니 정답~!이 되었다

코딩테스트 준비를 미~루고 미루다가 이제야 하게되었는데

진작 할 걸 그랬다!!

 

예전에 가볍게 문제 한 두개 풀어봤을 때에는

c++로 했었는데

아무래도 러닝분야로 일을 하고 있기 때문에

(노트북 문제도..)

python으로 갈아타서 조금 낯설다

 

얼른 적응해서 열공해야지

빠샤!!!

 

반응형

관련글 더보기

댓글 영역