본문 바로가기
백준알고리즘

백준 1926 그림[BFS]

by tiit 2020. 4. 23.
반응형

진짜 하루 죙일 품 ;;;;;;;;

 

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

 

1926번: 그림

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

www.acmicpc.net

package algo;

import java.awt.Point;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;

public class BJ_1926_2 {
public static int N;
public static int M;
public static int size; // 1의 사이즈를 잰다
public static int max; // 1의 최고 사이즈 
public static int cnt; // 1의 구역 갯수

public static int map[][];
public static boolean visited[][];
public static Queue q = new LinkedList();

public static final int dx[] = {1,-1,0,0}; // 동 서 남 북 순으로 탐색
public static final int dy[] = {0,0,-1,1}; // 동 서 남 북 순으로 탐색

    public static void main(String[] args) throws Exception{

     BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        
     StringTokenizer st = new StringTokenizer(br.readLine());
    
     N = Integer.parseInt(st.nextToken());
     M = Integer.parseInt(st.nextToken());
     map = new int[N][M];
     visited = 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());

     }
     }
    
     for(int i=0; i<N; i++) {
     for(int j=0; j<M; j++) { //map을 한 번씩 탐색하는 for문
     if(map[i][j] ==1 && !visited[i][j]) {
     size=0;
     q.offer(new Point(i,j));
     bfs(i,j);
     cnt++;
     }
     }
     }
     if(cnt ==0) {
System.out.println(0);
System.out.print(0);
}else {
System.out.println(cnt);
System.out.print(max);
}
    
    }
    
    public static void bfs(int x, int y) {
     int nx  ;
     int ny  ;
     q.offer(new Point(x,y)); //
     visited[x][y] = true;
    
     size++;
     while(!q.isEmpty()) { //큐가 빌 때까지 
     Point temp =q.poll(); //q에 넣었던 x,y좌표를 넣어주고 삭제 
    
     for(int d=0; d<4; d++) {
     nx = temp.x + dx[d];
     ny = temp.y + dy[d]; //다음 칸 좌표 , 동 서 남 북 순으로 탐색 
    
     if(nx<0 || ny<0 || nx>=N || ny>=M) {//다음 좌표가 맵을 벗어날때
     continue;
     }
     if(map[nx][ny] ==0 || visited[nx][ny]) { //다음 칸이 0이거나 방문했으면
     continue; //계속 for문 돌기 
     }
     //다음 칸이 방문 안했고 1일때
    
     q.offer(new Point(nx,ny));
     visited[nx][ny] =true;
     size++;
    
    
     }
    
    
     }
    
    
    
     max = max > size ? max : size;
    
    }
  
 
}

-----------------------------------------------------------------------------------

마지막에 import java.awt.Point; 

이거 안써줘서 컴파일 에러나서 진짜 빡쳤다..

다른 class 파일에 

class Point{
int x;
int y;

Point(int x, int y) {
this.x = x;
this.y = y;
}
}

이거 만들어 줘서 이 클래스 파일에서 Point 안만들어줘도 에러안나는데 백준에서 하려면 당연 컴파일 에러나지 

진짜 빡치지만 그래도 오늘도 하나 배웠다. . .. . . . ..........

블로그 보고 베끼는데 답이 계속 안나와서 

그냥 새로 다시 코드 쳐서 완성했더니 드디어 제대로 된 값 나왔다. 

아무리 봐도 둘이 뭐가 다른지 모르겠는데 답이 달라 개빡침............................................................. 

 

-----------------------

찾았다. dx ,dy로 적어야 되는데 

dx dx 로 적어서 탐색 이상하게 한거였음 ,,ㅋ,, ㅋ 

내 하루 ,, ,,,,,,,,,,,,,,

반응형

댓글