알고리즘문제풀이/백준

[BOJ]1743_음식물피하기_Java

초보개발자.. 2021. 11. 23. 22:20

--문제--

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

 

1743번: 음식물 피하기

첫째 줄에 통로의 세로 길이 N(1 ≤ N ≤ 100)과 가로 길이 M(1 ≤ M ≤ 100) 그리고 음식물 쓰레기의 개수 K(1 ≤ K ≤ N×M)이 주어진다.  그리고 다음 K개의 줄에 음식물이 떨어진 좌표 (r, c)가 주어진다

www.acmicpc.net

--문제접근--

이 문제는 1303 전쟁과 비슷한 문제로 가로세로 연결된 것들 중 가장 큰 값을 구하는 문제였습니다.

BFS를 활용하여 문제 풀이를 진행하였습니다.

 

--코드--

package DFS와BFS기본문제;

import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;

public class BOJ_1743_음식물피하기 {
	static class node{
		int x ,y;

		public node(int x, int y) {
			super();
			this.x = x;
			this.y = y;
		}	
	}
	static int[] dx= {1,-1,0,0};
	static int[] dy= {0,0,-1,1};
	public static void main(String[] args) {
		Scanner sc=new Scanner(System.in);
		int N=sc.nextInt();
		int M=sc.nextInt();
		int K=sc.nextInt();
		int[][] map=new int[N+1][M+1];
		boolean[][] check=new boolean[N+1][M+1];
		for(int i=0;i<K;i++) {
			int dx=sc.nextInt();
			int dy=sc.nextInt();
			map[dx][dy]=1;
		}
		int ans=0;
		for(int i=0;i<=N;i++) {
			for(int j=0;j<=M;j++) {
				if(map[i][j]==1) {
					int tmp=1;
					check[i][j]=true;
					Queue<node> que=new LinkedList<>();
					que.add(new node(i,j));
					//BFS작업
					while(!que.isEmpty()) {
						node cur=que.poll();
						for(int d=0;d<4;d++) {
							int dr=cur.x+dx[d];
							int dc=cur.y+dy[d];
							//맵안에있는지 확인, 음식물 쓰레기가 있는지 확인, 이전에 이미 체크햇는지 확인.
							if(dr>=1&&dc>=1&&dr<=N&&dc<=M&&map[dr][dc]==1&&!check[dr][dc]) {
								check[dr][dc]=true;
								tmp++;
								que.add(new node(dr,dc));
							}
						}
					}
					ans=Math.max(ans, tmp);
				}
			}
		}
		System.out.println(ans);
		
	}
}