코딍코딍
코딩기록
코딍코딍
전체 방문자
오늘
어제
  • 분류 전체보기 (271)
    • 개발 (2)
    • Java (1)
    • 스프링 (28)
    • JPA (11)
    • Git (3)
    • 알고리즘 (160)
      • 백준 (132)
      • 프로그래머스 (8)
      • SWEA (20)
    • 토이 프로젝트 (14)
      • 간단한 Springboot CRUD (1)
      • 게시판 프로젝트 (13)
    • 알고리즘 개념정리 (8)
    • 오류 해결 (13)
    • 보류 (0)
    • AWS (5)
    • 트러블 슈팅 (0)
    • 회고 (3)
    • CS (4)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

최근 글

티스토리

hELLO · Designed By 정상우.
코딍코딍

코딩기록

알고리즘/백준

2667번 : 단지번호붙이기

2022. 8. 1. 17:43

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

 

2667번: 단지번호붙이기

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

www.acmicpc.net

 

 

문제

 

 

코드

import java.util.*;

public class Main {
    static int g[][] = new int[25][25];
    static int n;
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        n = sc.nextInt(); sc.nextLine();

        for(int i=0;i<n;i++) {
            String str = sc.nextLine();
            for(int j=0;j<n;j++) {
                g[i][j] = str.charAt(j) - '0';
            }
        }

        ArrayList<Integer> arr = new ArrayList<>();
        for(int i=0;i<n;i++) {
            for(int j=0;j<n;j++) {
                if(g[i][j]==1) arr.add(bfs(i, j));
            }
        }
        System.out.println(arr.size());
        Collections.sort(arr);
        for(int i : arr) System.out.println(i);
    }

    static int dx[] = {-1,1,0,0};
    static int dy[] = {0,0,-1,1};
    private static int bfs(int i, int j) {
        Queue<int[]> q = new LinkedList<>();
        int count=0;

        q.add(new int[]{i, j});
        g[i][j]=0;

        while(!q.isEmpty()) {
            int cur[] = q.poll();
            count++;
            i = cur[0]; j = cur[1];
            for(int z=0;z<4;z++) {
                int nx = i+dx[z];
                int ny = j+dy[z];
                if(nx<0 || ny<0 || nx>=n || ny>=n) continue;
                if(g[nx][ny]==1) {
                    q.add(new int[]{nx, ny});
                    g[nx][ny]=0;
                }
            }
        }
        return count;
    }
}

 

 

해결방법

그래프의 탐색 시작 지점을 모르기에 2차원 배열 g를 전부 돌면서 값이 1인 곳에서 bfs()를 호출하였다.

탐색 중 값이 1인 부분은 0으로 바꿔 다시 탐색하지 않게끔 했다.
한 번의 bfs()가 끝나면 더 이상 확장이 불가능하므로 마을 하나가 탄생한다.
bfs()는 단지 내 집의 수(1의 개수)를 반환한다.

'알고리즘 > 백준' 카테고리의 다른 글

2512번 : 예산  (0) 2022.08.03
2805번 : 나무 자르기  (0) 2022.08.02
2178번 : 미로 탐색  (0) 2022.07.31
5545번 : 최고의 피자  (0) 2022.07.30
1758번 : 알바생 강호  (0) 2022.07.29
    '알고리즘/백준' 카테고리의 다른 글
    • 2512번 : 예산
    • 2805번 : 나무 자르기
    • 2178번 : 미로 탐색
    • 5545번 : 최고의 피자
    코딍코딍
    코딍코딍
    ㅎ2

    티스토리툴바