🔺 문제
1743번: 음식물 피하기
첫째 줄에 통로의 세로 길이 N(1 ≤ N ≤ 100)과 가로 길이 M(1 ≤ M ≤ 100) 그리고 음식물 쓰레기의 개수 K(1 ≤ K ≤ N×M)이 주어진다. 그리고 다음 K개의 줄에 음식물이 떨어진 좌표 (r, c)가 주어진다
www.acmicpc.net
🔺 코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
|
import java.util.*;
import java.io.*;
public class Main {
static int[] dx = {0, 0, -1, 1}; // 좌우
static int[] dy = {1, -1, 0, 0}; // 상하
static int N, M, K; // 세로, 가로, 음쓰 개수
static int max; // 가장 큰 음식물 크기
static int cnt;
static int[][] map;
static boolean[][] visited;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine()," ");
N = Integer.parseInt(st.nextToken());
M = Integer.parseInt(st.nextToken());
K = Integer.parseInt(st.nextToken());
map = new int[N][M];
visited = new boolean[N][M];
// 입력 받기
for(int i = 0 ; i < K ; i++) {
st = new StringTokenizer(br.readLine()," ");
int x = Integer.parseInt(st.nextToken());
int y = Integer.parseInt(st.nextToken());
map[x - 1][y - 1] = 1;
}
// 각 점마다 BFS 수행
for(int i = 0 ; i < N ; i++) {
for(int j = 0 ; j < M ; j++) {
if(!visited[i][j] && map[i][j] != 0) {
cnt = 0;
BFS(i, j);
max = Math.max(max, cnt);
}
}
}
System.out.println(max);
}
static void BFS(int x, int y) {
Queue<int[]> queue = new LinkedList<>();
queue.add(new int[] {x, y});
visited[x][y] = true;
cnt++;
while(!queue.isEmpty()) {
int[] now = queue.poll();
// 상하좌우 탐색
for(int d = 0 ; d < 4 ; d++) {
int curX = now[0] + dx[d];
int curY = now[1] + dy[d];
if(curX < 0 || curX >= N || curY < 0 || curY >= M ) continue;
if(!visited[curX][curY] && map[curX][curY] != 0) {
queue.add(new int[] {curX, curY});
visited[curX][curY] = true;
cnt++;
}
}
}
}
}
|
cs |
✅ 해결 아이디어
✔ DFS / BFS
- 각 점마다 BFS 수행
- 이 때 cnt는 0으로 초기화한 상태에서 진행해야 각 점마다 cnt를 구할 수 이씀!
- 그리고 이 값과 max를 비교해서 더 큰 값을 결과로 저장
map 배열을 int배열로 안 하고 boolean 배열로 해도 됨!
🔺 다른 풀이들
- cnt를 BFS 메소드 안에 넣으셨다
& 방문 배열인 boolean[] visited
를 만들지 않고, int[][] map
에서 방문 가능한 위치(=1)일 때 값을 0으로 바꾸면서 한 번에 방문 처리하셨다
[백준] 1743번 음식물 피하기 - Java, 자바
실버 1https://www.acmicpc.net/problem/1743DFS/BFS로 풀 수 있는 문제. 나는 BFS로 풀었다. 문제풀이1\. 음식물 쓰레기의 위치를 2차원 배열(arr)에 담는다. => arrx-1 = 12\. 2중 for문을 돌리며 arr
velog.io
💬 느낀 점
이제 상하좌우 탐색 좀 감이 잡혔다!
1회독 | 2회독 | 3회독 | 4회독 | 5회독 |
V |
(참고)
백준_1743 음식물 피하기(자바) / DFS & BFS
시간 & 메모리 제한 문제 사방탐색을 문제에 주셔야죠,,,, 힌트에서 줬네요; 입력 & 출력 DFS를 이용한 문제풀이 package com.Back; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader;
codingtalk.tistory.com
'코테 > 백준' 카테고리의 다른 글
[백준/JAVA] 16953번: A → B (0) | 2023.05.26 |
---|---|
[백준/JAVA] 2606번: 바이러스 (1) | 2023.05.26 |
[백준/JAVA] 1303번: 전쟁 - 전투 (0) | 2023.05.25 |
[백준/JAVA] 17070번: 파이프 옮기기 1 (1) | 2023.05.24 |
[백준/JAVA] 1038번: 감소하는 수 (0) | 2023.05.24 |