코테/백준

[백준/JAVA] 1743번: 음식물 피하기

imname1am 2023. 5. 26. 01:15
반응형

🔺 문제

 

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 = {00-11};    // 좌우
    static int[] dy = {1-100};    // 상하
    
    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

 

반응형