단지+번호+붙히기

1997년 한국정보올림피아드 본선 초등부 1번 문제 - 단지 번호 붙이기
NxN크기의 정사각형 모양의 지도가 있다. 지도에서 0은 집 없음, 1은 집 있음을 나타낸다. 단지란 왼쪽, 오른쪽, 위쪽, 아래쪽으로 연결되어 있는 집들의 집합이다. 예를 들어, 다음 지도에서는 세 개의 단지가 있다.



각 단지의 크기는 7, 8, 9이다. 입력 데이터가 주어지면, 단지의 개수와 각 단지의 크기를 출력하는 프로그램을 작성하시오.

입력
첫줄에는 지도의 크기 N(100이하의 정수) 둘째 줄부터는 지도가 주어진다.

출력
첫줄에는 단지의 개수, 둘째 줄에는 각 단지의 크기를 오름차순으로 출력한다.

입력 예
7

0 1 1 0 1 0 0

0 1 1 0 1 0 1

1 1 1 0 1 0 1

0 0 0 0 1 1 1

0 1 0 0 0 0 0

0 1 1 1 1 1 0

0 1 1 1 0 0 0

출력 예
3

7 8 9

출처
Source Code code format="java5"

import java.util.Arrays; public class BlobCounter { public static void main(String[] args) { int[][] map = { { 0, 1, 1, 0, 1, 0, 0 },       { 0, 1, 1, 0, 1, 0, 1 },        { 1, 1, 1, 0, 1, 0, 1 },        { 0, 0, 0, 0, 1, 1, 1 },        { 0, 1, 0, 0, 0, 0, 0 },        { 0, 1, 1, 1, 1, 1, 0 },        { 0, 1, 1, 1, 0, 0, 0 } };      int[] blob = new int[map.length * map.length / 2]; int index = -1; for (int i = 0; i < map.length; i++) { for (int j = 0; j < map.length; j++) { int c = count(map, i, j); if (c != 0) { blob[++index] = c;       } }     }

blob = Arrays.copyOf(blob, index + 1); Arrays.sort(blob); System.out.println(Arrays.toString(blob)); }    public static int count(int[][] map, int r, int c) { // 맵 범위를 벗어나면 if (r < 0 || r >= map.length || c < 0 || c >= map.length) { return 0; }     // 집이 없으면 else if (map[r][c] == 0) { return 0; }     else { map[r][c] = 0; return 1 + count(map, r - 1, c) + count(map, r + 1, c)        + count(map, r, c - 1) + count(map, r, c + 1); }    }    }

code

Comment