[Java] 백준 1012번 (유기농 배추)

2024. 3. 30. 19:53·BOJ, Programmers

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
'BOJ, Programmers' 카테고리의 다른 글
  • [Java] 백준 1500 (최대곱)
  • [Java] 백준 1010번 (다리놓기)
  • [Java] 백준 1049 (좋은 구간)
  • Test
Economy98
Economy98
공부하고 기록하기
  • Economy98
    Economy_Dev
    Economy98
  • 전체
    오늘
    어제
    • 분류 전체보기 (74)
      • Spring Framework (11)
      • BOJ, Programmers (22)
      • Java (4)
      • JDBC (6)
      • JPA (9)
      • Spring Transaction (3)
      • Algorithm (1)
      • Web (5)
      • Projects (2)
        • 쇼핑몰 프로젝트 (0)
        • 열람실 & 도서관 프로젝트 (2)
      • Network (2)
      • 나의 공부방 (5)
      • 끄적끄적 (1)
      • Error Log (3)
      • CS (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
    • Github
  • 링크

    • Github
  • 공지사항

  • 인기 글

  • 태그

    그리디 알고리즘
    java
    restful api
    예외 처리
    JPA
    propagation
    jdbc
    자바
    백준 자바 풀이
    스프링
    Spring
    스프링부트
    정렬
    브루트포스 알고리즘
    백준
    자바 문제
    트랜잭션
    백준 풀이
    다이나믹 프로그래밍
    자바 문제 풀이
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.1
Economy98
[Java] 백준 1012번 (유기농 배추)
상단으로

티스토리툴바