https://www.acmicpc.net/problem/1012
1012번: 유기농 배추
차세대 영농인 한나는 강원도 고랭지에서 유기농 배추를 재배하기로 하였다. 농약을 쓰지 않고 배추를 재배하려면 배추를 해충으로부터 보호하는 것이 중요하기 때문에, 한나는 해충 방지에
www.acmicpc.net
전형적인 bfs 문제이다. Queue를 사용해서 풀었다.
먼저 초기화 작업이다.
문제에 나와있듯이 각 케이스마다 m, n, k를 구해야 한다.
StringTokenizer를 사용해 변수에 값을 넣었다.
t = new StringTokenizer(br.readLine()); int m = Integer.parseInt(st.nextToken()); int n = Integer.parseInt(st.nextToken()); int k = Integer.parseInt(st.nextToken());
그리고 이 변수들을 사용해
0,과 1이 들어간 배추자리(없으면 0, 있으면 1)
그 배열을 방문했는지 체크하는 boolean 배열
그리고 배열을 탐색할 때 쓰는 Queue를 선언하였다.
maps = new int[m][n]; visited = new boolean[m][n]; queue = new LinkedList<>();
그 다음 배추가 있는자리 ( 배열의 값이 1) 이거나
방문하지 않은 배열이라면 그 좌표값을 매개변수로 하는 bfs라는 메소드를 실행하는 코드이다.
실행할때 마다 벌레의 갯수를 세는 cnt가 1씩 증가 한다.
for (int j = 0; j < maps.length; j++) { for (int z = 0; z < maps[0].length; z++) { if(!visited[j][z] && maps[j][z] == 1) { bfs(j, z); cnt++; } } //for } // for
bfs 메서드이다.
매개변수로 받은 좌표값(x값, y값)을 가지고 새로운 int형 배열을 만들어 Queue에 넣는다.
그리고 그 좌표들은 방문을 했으니 visited[]에(방문 체크 boolean형 배열) true를 넣는다.
그 다음 while문을 실행하는데 poll 함수를 통해 현재 좌표를 갖고온뒤
미리 움직일 좌표를 더하고 만약 그 움직일 좌표가 0보다 작거나 배열의 크기보다 크면 continue하기로 한다.
그리고 방문하지 않았거나 배추가 있는자리 ( 움직일 좌표의 값이 1 일시) 다시 Queue에 움직일 좌표를 배열로 넣는다.
public static void bfs(int x, int y) { queue.add(new int[] {x, y}); visited[x][y] = true; while (!queue.isEmpty()) { int current[] = queue.poll(); int cx = current[0]; int cy = current[1]; for (int i = 0; i < 4 ; i++) { int mx = cx + dx[i]; int my = cy + dy[i]; if (mx < 0 || mx >= maps.length || my < 0 || my >= maps[0].length) { continue; } // if if(!visited[mx][my] && maps[mx][my] == 1) { queue.add(new int[] {mx, my}); visited[mx][my] = true; } } // for } // while } // bfs
아래는 전체 코드이다.
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.LinkedList; import java.util.Queue; import java.util.StringTokenizer; public class Main { static final int dx[] = {-1, 0, 1, 0}; static final int dy[] = {0, 1, 0, -1}; static int maps[][] ; static boolean visited[][]; static Queue<int[]> queue; public static void main(String[] args) throws NumberFormatException, IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); int T = Integer.parseInt(br.readLine()); StringTokenizer st; ArrayList<Integer> list = new ArrayList<>(); for (int i = 0; i < T; i++) { // init st = new StringTokenizer(br.readLine()); int m = Integer.parseInt(st.nextToken()); int n = Integer.parseInt(st.nextToken()); int k = Integer.parseInt(st.nextToken()); maps = new int[m][n]; visited = new boolean[m][n]; queue = new LinkedList<>(); int cnt = 0; for (int j = 0; j < k; j++) { st = new StringTokenizer(br.readLine()); int x = Integer.parseInt(st.nextToken()); int y = Integer.parseInt(st.nextToken()); maps[x][y] = 1; } for (int j = 0; j < maps.length; j++) { for (int z = 0; z < maps[0].length; z++) { if(!visited[j][z] && maps[j][z] == 1) { bfs(j, z); cnt++; } } //for } // for list.add(cnt); } // for for (int i : list) { System.out.println(i); } } // main public static void bfs(int x, int y) { queue.add(new int[] {x, y}); visited[x][y] = true; while (!queue.isEmpty()) { int current[] = queue.poll(); int cx = current[0]; int cy = current[1]; for (int i = 0; i < 4 ; i++) { int mx = cx + dx[i]; int my = cy + dy[i]; if (mx < 0 || mx >= maps.length || my < 0 || my >= maps[0].length) { continue; } // if if(!visited[mx][my] && maps[mx][my] == 1) { queue.add(new int[] {mx, my}); visited[mx][my] = true; } } // for } // while } // bfs } // class
'BOJ, Programmers' 카테고리의 다른 글
[JAVA] 백준 1041 (주사위) (0) | 2024.04.05 |
---|---|
[Java] 백준 1500 (최대곱) (0) | 2024.04.03 |
[Java] 백준 1010번 (다리놓기) (0) | 2024.03.30 |
[Java] 백준 1049 (좋은 구간) (1) | 2024.03.30 |
Test (0) | 2024.03.30 |