Skip to content

Commit

Permalink
[SOLVED] SOLVED boj1012
Browse files Browse the repository at this point in the history
  • Loading branch information
judemin committed Jan 21, 2025
1 parent 1daedf1 commit 61283f0
Show file tree
Hide file tree
Showing 2 changed files with 216 additions and 0 deletions.
103 changes: 103 additions & 0 deletions 6_BFS/1012번: 유기농 배추/Main.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,103 @@
/* ************************************************************************** */
/* */
/* ::: ::: ::: */
/* Problem Number: 1012 :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: judemin <boj.kr/u/judemin> +#+ +#+ +#+ */
/* +#+ +#+ +#+ */
/* https://boj.kr/1012 #+# #+# #+# */
/* Solved: 2025/01/21 22:53:20 by judemin ### ### ##.kr */
/* */
/* ************************************************************************** */
import java.io.*;
import java.util.*;

class Main{
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
// 4방향 정의
int[] dirX = {1, -1, 0, 0}; int[] dirY = {0, 0, 1, -1};
// map 정의 (메모리 초과 방지를 루프 밖에서 정의)
int[][] map = new int[60][60];
// deque 정의 (메모리 초과 방지를 루프 밖에서 정의)
Deque<Pair> deq = new ArrayDeque<Pair>();
int T = Integer.parseInt(br.readLine());
StringTokenizer st;

for(int i = 0;i < T;i++){
st = new StringTokenizer(br.readLine());
// 가로 길이 (1 ~ 50)
int M = Integer.parseInt(st.nextToken());
// 세로 길이 (1 ~ 50)
int N = Integer.parseInt(st.nextToken());
int K = Integer.parseInt(st.nextToken());

// Map 초기화
for(int j = 0;j < N + 10;j++)
for(int k = 0;k < M + 10;k++)
map[j][k] = 0;

// 각 BFS의 시작 위치를 찾을 Pair 배열 정의
Pair[] cabbage = new Pair[K];

for(int j = 0;j < K;j++){
st = new StringTokenizer(br.readLine());
// 별도의 검사 코드를 넣지 않기 위해 각 좌표에 + 1
int x = Integer.parseInt(st.nextToken()) + 1;
int y = Integer.parseInt(st.nextToken()) + 1;
cabbage[j] = new Pair(x, y);
// Map 상에서는 [y][x]로 좌표 반전
map[y][x] = 1;
}

int result = 0;
for(int j = 0;j < K;j++){
if(map[cabbage[j].getY()][cabbage[j].getX()] == 0)
continue;

deq.addFirst(cabbage[j]);
map[cabbage[j].getY()][cabbage[j].getX()] = 0;
while (true) {
if(deq.isEmpty())
break;

Pair nowPair = deq.removeLast();
int x = nowPair.getX();
int y = nowPair.getY();

for(int k = 0;k < 4;k++){
int nextX = x + dirX[k];
int nextY = y + dirY[k];
if(map[nextY][nextX] == 1){
deq.addFirst(new Pair(nextX, nextY));
// Queue에 넣을 때 방문 표시
map[nextY][nextX] = 0;
}
}
}
result++;
}
bw.write("" + result + "\n");
}
bw.flush();
}
}

class Pair{
int x;
int y;

Pair(int x,int y){
this.x = x;
this.y = y;
}

public int getX(){
return x;
}

public int getY(){
return y;
}
}
113 changes: 113 additions & 0 deletions 6_BFS/1012번: 유기농 배추/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,113 @@
# 1012번: 유기농 배추 - <img src="https://static.solved.ac/tier_small/9.svg" style="height:20px" /> Silver II

<!-- performance -->

<!-- 문제 제출 후 깃허브에 푸시를 했을 때 제출한 코드의 성능이 입력될 공간입니다.-->

<!-- end -->

## 문제

[문제 링크](https://boj.kr/1012)


<p>차세대 영농인 한나는 강원도 고랭지에서 유기농 배추를 재배하기로 하였다. 농약을 쓰지 않고&nbsp;배추를 재배하려면 배추를 해충으로부터 보호하는 것이 중요하기 때문에, 한나는 해충 방지에&nbsp;효과적인 배추흰지렁이를 구입하기로 결심한다. 이 지렁이는 배추근처에 서식하며 해충을 잡아&nbsp;먹음으로써 배추를 보호한다. 특히, 어떤 배추에 배추흰지렁이가 한 마리라도 살고 있으면 이 지렁이는 인접한 다른 배추로 이동할 수 있어, 그 배추들 역시 해충으로부터 보호받을 수 있다. 한 배추의 상하좌우 네 방향에 다른 배추가 위치한 경우에 서로 인접해있는 것이다.</p>

<p>한나가 배추를 재배하는 땅은 고르지 못해서 배추를 군데군데 심어 놓았다. 배추들이 모여있는 곳에는 배추흰지렁이가 한 마리만 있으면 되므로 서로 인접해있는 배추들이 몇 군데에 퍼져있는지 조사하면 총 몇 마리의 지렁이가 필요한지 알 수 있다. 예를 들어 배추밭이 아래와 같이 구성되어 있으면 최소 5마리의 배추흰지렁이가 필요하다. 0은 배추가 심어져 있지 않은 땅이고, 1은 배추가 심어져 있는 땅을 나타낸다.</p>

<table class="table table-bordered" style="width:40%">
<tbody>
<tr>
<td style="text-align:center; width:4%"><strong>1</strong></td>
<td style="text-align:center; width:4%"><strong>1</strong></td>
<td style="text-align:center; width:4%">0</td>
<td style="text-align:center; width:4%">0</td>
<td style="text-align:center; width:4%">0</td>
<td style="text-align:center; width:4%">0</td>
<td style="text-align:center; width:4%">0</td>
<td style="text-align:center; width:4%">0</td>
<td style="text-align:center; width:4%">0</td>
<td style="text-align:center; width:4%">0</td>
</tr>
<tr>
<td style="text-align:center; width:4%">0</td>
<td style="text-align:center; width:4%"><strong>1</strong></td>
<td style="text-align:center; width:4%">0</td>
<td style="text-align:center; width:4%">0</td>
<td style="text-align:center; width:4%">0</td>
<td style="text-align:center; width:4%">0</td>
<td style="text-align:center; width:4%">0</td>
<td style="text-align:center; width:4%">0</td>
<td style="text-align:center; width:4%">0</td>
<td style="text-align:center; width:4%">0</td>
</tr>
<tr>
<td style="text-align:center; width:4%">0</td>
<td style="text-align:center; width:4%">0</td>
<td style="text-align:center; width:4%">0</td>
<td style="text-align:center; width:4%">0</td>
<td style="text-align:center; width:4%"><strong>1</strong></td>
<td style="text-align:center; width:4%">0</td>
<td style="text-align:center; width:4%">0</td>
<td style="text-align:center; width:4%">0</td>
<td style="text-align:center; width:4%">0</td>
<td style="text-align:center; width:4%">0</td>
</tr>
<tr>
<td style="text-align:center; width:4%">0</td>
<td style="text-align:center; width:4%">0</td>
<td style="text-align:center; width:4%">0</td>
<td style="text-align:center; width:4%">0</td>
<td style="text-align:center; width:4%"><strong>1</strong></td>
<td style="text-align:center; width:4%">0</td>
<td style="text-align:center; width:4%">0</td>
<td style="text-align:center; width:4%">0</td>
<td style="text-align:center; width:4%">0</td>
<td style="text-align:center; width:4%">0</td>
</tr>
<tr>
<td style="text-align:center; width:4%">0</td>
<td style="text-align:center; width:4%">0</td>
<td style="text-align:center; width:4%"><strong>1</strong></td>
<td style="text-align:center; width:4%"><strong>1</strong></td>
<td style="text-align:center; width:4%">0</td>
<td style="text-align:center; width:4%">0</td>
<td style="text-align:center; width:4%">0</td>
<td style="text-align:center; width:4%"><strong>1</strong></td>
<td style="text-align:center; width:4%"><strong>1</strong></td>
<td style="text-align:center; width:4%"><strong>1</strong></td>
</tr>
<tr>
<td style="text-align:center; width:4%">0</td>
<td style="text-align:center; width:4%">0</td>
<td style="text-align:center; width:4%">0</td>
<td style="text-align:center; width:4%">0</td>
<td style="text-align:center; width:4%"><strong>1</strong></td>
<td style="text-align:center; width:4%">0</td>
<td style="text-align:center; width:4%">0</td>
<td style="text-align:center; width:4%"><strong>1</strong></td>
<td style="text-align:center; width:4%"><strong>1</strong></td>
<td style="text-align:center; width:4%"><strong>1</strong></td>
</tr>
</tbody>
</table>



## 입력


<p>입력의 첫 줄에는 테스트 케이스의 개수 T가 주어진다. 그 다음 줄부터 각각의 테스트 케이스에 대해 첫째 줄에는 배추를 심은 배추밭의 가로길이 M(1 ≤ M ≤ 50)과 세로길이 N(1 ≤ N ≤ 50), 그리고 배추가 심어져 있는 위치의 개수 K(1 ≤ K ≤ 2500)이 주어진다. 그 다음 K줄에는 배추의 위치 X(0 ≤ X ≤ M-1), Y(0 ≤ Y ≤ N-1)가 주어진다. 두 배추의 위치가 같은 경우는 없다.</p>



## 출력


<p>각 테스트 케이스에 대해 필요한 최소의 배추흰지렁이 마리 수를 출력한다.</p>



## 소스코드

[소스코드 보기](Main.java)

0 comments on commit 61283f0

Please sign in to comment.