Skip to content

Commit c8d109c

Browse files
committed
[Silver I] Title: 음식물 피하기, Time: 144 ms, Memory: 15708 KB -BaekjoonHub
1 parent 8cc3298 commit c8d109c

File tree

2 files changed

+141
-0
lines changed

2 files changed

+141
-0
lines changed
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
# [Silver I] 음식물 피하기 - 1743
2+
3+
[문제 링크](https://www.acmicpc.net/problem/1743)
4+
5+
### 성능 요약
6+
7+
메모리: 15708 KB, 시간: 144 ms
8+
9+
### 분류
10+
11+
그래프 이론, 그래프 탐색, 너비 우선 탐색, 깊이 우선 탐색, 격자 그래프, 플러드 필
12+
13+
### 제출 일자
14+
15+
2025년 8월 12일 16:50:49
16+
17+
### 문제 설명
18+
19+
<p>코레스코 콘도미니엄 8층은 학생들이 3끼의 식사를 해결하는 공간이다. 그러나 몇몇 비양심적인 학생들의 만행으로 음식물이 통로 중간 중간에 떨어져 있다. 이러한 음식물들은 근처에 있는 것끼리 뭉치게 돼서 큰 음식물 쓰레기가 된다. </p>
20+
21+
<p>이 문제를 출제한 선생님은 개인적으로 이러한 음식물을 실내화에 묻히는 것을 정말 진정으로 싫어한다. 참고로 우리가 구해야 할 답은 이 문제를 낸 조교를 맞추는 것이 아니다. </p>
22+
23+
<p>통로에 떨어진 음식물을 피해가기란 쉬운 일이 아니다. 따라서 선생님은 떨어진 음식물 중에 제일 큰 음식물만은 피해 가려고 한다. </p>
24+
25+
<p>선생님을 도와 제일 큰 음식물의 크기를 구해서 “10ra"를 외치지 않게 도와주자.</p>
26+
27+
### 입력
28+
29+
<p>첫째 줄에 통로의 세로 길이 N(1 ≤ N ≤ 100)과 가로 길이 M(1 ≤ M ≤ 100) 그리고 음식물 쓰레기의 개수 K(1 ≤ K ≤ N×M)이 주어진다. 그리고 다음 K개의 줄에 음식물이 떨어진 좌표 (r, c)가 주어진다.</p>
30+
31+
<p>좌표 (r, c)의 r은 위에서부터, c는 왼쪽에서부터가 기준이다. 입력으로 주어지는 좌표는 중복되지 않는다.</p>
32+
33+
### 출력
34+
35+
<p>첫째 줄에 음식물 중 가장 큰 음식물의 크기를 출력하라.</p>
36+
Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,105 @@
1+
import java.io.*;
2+
import java.util.*;
3+
4+
public class Main {
5+
static int N, M, K;
6+
static int[][] graph;
7+
static boolean[][] visited;
8+
static int[] dx = {0, 0, -1, 1};
9+
static int[] dy = {-1, 1, 0, 0};
10+
static int maxFoodSize = 0;
11+
12+
public static void main(String[] args) throws IOException{
13+
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
14+
StringTokenizer st = new StringTokenizer(br.readLine());
15+
16+
N = Integer.parseInt(st.nextToken());
17+
M = Integer.parseInt(st.nextToken());
18+
K = Integer.parseInt(st.nextToken());
19+
20+
graph = new int[N+1][M+1];
21+
visited = new boolean[N+1][M+1];
22+
23+
for(int i=0; i<K; i++){
24+
st = new StringTokenizer(br.readLine());
25+
int x = Integer.parseInt(st.nextToken());
26+
int y = Integer.parseInt(st.nextToken());
27+
28+
graph[x][y] = 1;
29+
}
30+
31+
// for(int[] arr : graph){
32+
// for(int a : arr){
33+
// System.out.print(a + " ");
34+
// }
35+
// System.out.println();
36+
// }
37+
38+
39+
for(int i=1; i<=N; i++){
40+
for(int j=1; j<=M; j++){
41+
if(!visited[i][j] && graph[i][j] == 1){
42+
// int foodSize = dfs(i, j);
43+
// System.out.println("i: " + i + "j: " + j + "foodSize: " + foodSize);
44+
// maxFoodSize = Math.max(dfs(i, j), maxFoodSize);
45+
maxFoodSize = Math.max(bfs(i, j), maxFoodSize);
46+
47+
}
48+
}
49+
}
50+
51+
System.out.println(maxFoodSize);
52+
}
53+
54+
static int dfs(int x, int y){
55+
visited[x][y] = true;
56+
int size = 1;
57+
58+
for(int i=0; i<=3; i++){
59+
int newX = x+dx[i];
60+
int newY = y+dy[i];
61+
62+
if(rangeCheck(newX, newY) && !visited[newX][newY] && graph[newX][newY] == 1){
63+
size+=dfs(newX, newY);
64+
}
65+
}
66+
67+
return size;
68+
}
69+
70+
static int bfs(int x, int y){
71+
int size = 0;
72+
Queue<Node> q = new LinkedList<>();
73+
q.offer(new Node(x, y));
74+
75+
while(!q.isEmpty()){
76+
Node node = q.poll();
77+
78+
for(int i=0; i<=3; i++){
79+
int newX = node.x+dx[i];
80+
int newY = node.y+dy[i];
81+
82+
if(rangeCheck(newX, newY) && !visited[newX][newY] && graph[newX][newY] == 1){
83+
size++;
84+
visited[newX][newY] = true;
85+
q.offer(new Node(newX, newY));
86+
}
87+
}
88+
}
89+
90+
return size;
91+
}
92+
93+
static class Node{
94+
int x;
95+
int y;
96+
97+
Node(int x, int y){
98+
this.x = x;
99+
this.y = y;
100+
}
101+
}
102+
static boolean rangeCheck(int x, int y){
103+
return x>=1 && y>=1 && x<=N && y<=M;
104+
}
105+
}

0 commit comments

Comments
 (0)