기몽수
코딩 기록일지
기몽수
전체 방문자
오늘
어제
  • 분류 전체보기 (443)
    • 알고리즘 - SWEA (210)
      • D1 (19)
      • D2 (25)
      • D3 (143)
      • D4 (21)
      • D5 (2)
    • 알고리즘 - Programmers (74)
      • Unrated (34)
      • Lv 0 (4)
      • Lv 1 (3)
      • Lv 2 (32)
      • Lv 3 (1)
    • 알고리즘 - Baekjoon (158)
      • Bronze (1)
      • Silver (65)
      • Gold (90)
      • Platinum (2)
    • 취업 (0)
    • SSAFY (1)
hELLO · Designed By 김용수.
기몽수

코딩 기록일지

알고리즘 - Baekjoon/Silver

[백준] 1926번 : 그림 Silver1(실버1) - JAVA[자바]

2023. 10. 26. 09:36

[Silver I] 그림 - 1926

문제 링크

성능 요약

메모리: 44896 KB, 시간: 448 ms

분류

너비 우선 탐색, 깊이 우선 탐색, 그래프 이론, 그래프 탐색

문제 설명

어떤 큰 도화지에 그림이 그려져 있을 때, 그 그림의 개수와, 그 그림 중 넓이가 가장 넓은 것의 넓이를 출력하여라. 단, 그림이라는 것은 1로 연결된 것을 한 그림이라고 정의하자. 가로나 세로로 연결된 것은 연결이 된 것이고 대각선으로 연결이 된 것은 떨어진 그림이다. 그림의 넓이란 그림에 포함된 1의 개수이다.

입력

첫째 줄에 도화지의 세로 크기 n(1 ≤ n ≤ 500)과 가로 크기 m(1 ≤ m ≤ 500)이 차례로 주어진다. 두 번째 줄부터 n+1 줄 까지 그림의 정보가 주어진다. (단 그림의 정보는 0과 1이 공백을 두고 주어지며, 0은 색칠이 안된 부분, 1은 색칠이 된 부분을 의미한다)

출력

첫째 줄에는 그림의 개수, 둘째 줄에는 그 중 가장 넓은 그림의 넓이를 출력하여라. 단, 그림이 하나도 없는 경우에는 가장 넓은 그림의 넓이는 0이다.

 

 

 

import java.io.*;
import java.util.*;

class Main
{
    static int[][] map;
    static boolean[][] visit;
    static int maxArea;
    static int[] dirX = {-1,1,0,0};
    static int[] dirY = {0,0,-1,1};

	public static void main(String args[]) throws Exception
	{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        StringTokenizer st = new StringTokenizer(br.readLine());
        int n = Integer.parseInt(st.nextToken());
        int m = Integer.parseInt(st.nextToken());

        map = new int[n][m];
        visit = new boolean[n][m];
        
        for(int i = 0; i < n; i++){
            st = new StringTokenizer(br.readLine());
            for(int j = 0; j < m; j++){
                map[i][j] = Integer.parseInt(st.nextToken());
            }
        }

        int count = 0;
        for(int i = 0; i < n; i++){
            for(int j = 0; j < m; j++){
                if(map[i][j] == 1 && !visit[i][j]){
                    bfs(i,j);
                    count++;
                }
            }
        }
        bw.write(count + "\n");
        bw.write(maxArea + "\n");
        bw.flush();
        bw.close();
    }
    private static void bfs(int x, int y) {
        Queue<int[]> queue = new LinkedList<>();
        visit[x][y] = true;
        queue.add(new int[] {x,y});

        int area = 1;
        while(!queue.isEmpty()){
            int[] n = queue.poll();
            int curX = n[0];
            int curY = n[1];

            for(int i = 0; i < 4; i++){
                int nx = curX + dirX[i];
                int ny = curY + dirY[i];

                // 범위 내인지 확인
                if(nx < 0 || ny < 0 || nx >= map.length || ny >= map[0].length){
                    continue;
                }
                if(map[nx][ny] == 0 || visit[nx][ny]){
                    continue;
                }

                area++;
                visit[nx][ny] = true;
                queue.add(new int[] {nx,ny});
            }
        }

        maxArea = Math.max(maxArea, area);
    }
}

BFS를 전부 까먹어서 처음부터 다시 풀어보기

'알고리즘 - Baekjoon > Silver' 카테고리의 다른 글

[백준] 16922번 : 로마 숫자 만들기 Silver2(실버2) - JAVA[자바]  (0) 2023.10.26
[백준] 13706번 : 제곱근 Silver4(실버 4) - JAVA[자바]  (1) 2023.10.26
[백준] 3986번 : 좋은 단어 Silber4(실버4) - JAVA[자바]  (0) 2023.10.25
[백준] 2512번 : 예산 Silver2(실버2) - JAVA[자바]  (0) 2023.10.25
[백준] 10971번 : 외판원 순회2 Silver2(실버2) - JAVA[자바]  (0) 2023.10.24
    '알고리즘 - Baekjoon/Silver' 카테고리의 다른 글
    • [백준] 16922번 : 로마 숫자 만들기 Silver2(실버2) - JAVA[자바]
    • [백준] 13706번 : 제곱근 Silver4(실버 4) - JAVA[자바]
    • [백준] 3986번 : 좋은 단어 Silber4(실버4) - JAVA[자바]
    • [백준] 2512번 : 예산 Silver2(실버2) - JAVA[자바]
    기몽수
    기몽수

    티스토리툴바