Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- LeetCode #릿코드 #좋은 하루 되세요 #Have a nice day
- DFS
- HAVE A GOOD DAY
- amazon
- SSAFY IM/A
- Have a good day :)
- Hamming weight
- 우유가 옆으로 넘어지면 아야
- 텐션 업 10기!
- 모르고리즘
- 텐션 업 10기 화이팅
- SSAFY 10기 화이팅
- 아자아자 화이팅
- 자료구조
- 수학
- SSAFY 테스트
- Have a nice day.
- BFS
- DP
- SSAFY 화이팅
- 우유가옆으로넘어지면아야
- Java 환경 설정
- SeongSeobDang
- 네트워크
- have a nice day
- I am Korean
- 우유아야
- 코로나 싫어요
- 자고 싶다
Archives
- Today
- Total
Hope Everyone Is Happy
[실버2] 1012. 유기농 배추 (Java) 본문
728x90
반응형
https://www.acmicpc.net/problem/1012
1012번: 유기농 배추
차세대 영농인 한나는 강원도 고랭지에서 유기농 배추를 재배하기로 하였다. 농약을 쓰지 않고 배추를 재배하려면 배추를 해충으로부터 보호하는 것이 중요하기 때문에, 한나는 해충 방지에
www.acmicpc.net
양배추 - 눈물샤워

※ 문제를 요약하면 아래와 같습니다.
▶ 가로가 M 세로가 N인 크기의 지도에서 K개의 배추가 존재
▶ 해충을 잡기위해 지렁이를 배치
▶ 지렁이는 상하좌우에 배추가 존재 시 이동하며 해충들 섭취
▶ 최소로 필요한 지렁이 수
▶ Input : 첫째 줄에 testcase 횟수, 다음 줄에 M, N, K가 공백으로 구분되어 주어지고, K줄만큼 배추의 좌표 (가로,세로)
▶ Output : testcase별 최소 지렁이 수 출력
◈ Input - 1
2
10 8 17
0 0
1 0
1 1
4 2
4 3
4 5
2 4
3 4
7 4
8 4
9 4
7 5
8 5
9 5
7 6
8 6
9 6
10 10 1
5 5
◈ Output - 1
5
1
◈ Input - 2
1
5 3 6
0 2
1 2
2 2
3 2
4 2
4 0
◈ Output - 2
2
◎ 코드 작성 전, 아래와 같이 솔루션을 정리하였습니다.
▶ 최소 지렁이 수 == DFS 횟수
▶ map으로 입력 받을 때 boolean 2차원 배열로 저장하여 1일 경우 true로 저장
▶ DFS를 재귀형태로 구현, 주어진 map 배열에서 각 좌표 별로 상,하,좌,우를 탐색하여 1일 경우 계속 탐색
▶ 상하좌우 탐색은 델타로 구현
▶ 탐색 시 방문처리 필수
▶ DFS 종료 할 때마다 지렁이 1씩 카운트
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.ArrayList;
import java.util.Collections;
import java.util.StringTokenizer;
public class Main {
static boolean[][] barrVisited;
static boolean[][] barrFarm;
// 동서 남북
static int[] dr = { 0, 0, 1, -1 };
static int[] dc = { 1, -1, 0, 0 };
public static void main(String[] args) throws IOException {
// 대박 대박 대박
System.setIn(new FileInputStream(Main.class.getResource("input.txt").getPath()));
BufferedReader bReader = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bWriter = new BufferedWriter(new OutputStreamWriter(System.out));
int T = Integer.parseInt(bReader.readLine());
for (int t = 0; t < T; t++) {
StringTokenizer st = new StringTokenizer(bReader.readLine());
int M = Integer.parseInt(st.nextToken()); // cols
int N = Integer.parseInt(st.nextToken()); // rows
int K = Integer.parseInt(st.nextToken()); // cabbage count
barrVisited = new boolean[N][M];
barrFarm = new boolean[N][M];
for (int i = 0; i < K; i++) {
st = new StringTokenizer(bReader.readLine());
int nCol = Integer.parseInt(st.nextToken());
int nRow = Integer.parseInt(st.nextToken());
barrFarm[nRow][nCol] = true;
}
int nWarm = 0;
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
if (barrFarm[i][j] && !barrVisited[i][j]) {
DFS(i, j);
nWarm++;
}
}
}
bWriter.write(nWarm + "\n");
bWriter.flush();
}
bWriter.close();
}
public static void DFS(int nRow, int nCol) {
// 기저 조건
if (barrVisited[nRow][nCol])
return;
// 탐색 조건
barrVisited[nRow][nCol] = true;
for (int k = 0; k < dr.length; k++) {
int nRowSearch = nRow + dr[k];
int nColSearch = nCol + dc[k];
// 동, 서, 남, 북 중 배추가 있다
if (nRowSearch >= 0 && nColSearch >= 0 && nRowSearch < barrFarm.length && nColSearch < barrFarm[0].length
&& barrFarm[nRowSearch][nColSearch])
DFS(nRowSearch, nColSearch);
}
}
}
Good Luck! (피드백 감사합니다!)
'※ 백준 (Baekjoon) > [Java] 문제 풀이 ( Solve the problems)' 카테고리의 다른 글
[골드5] 7576. 토마토 (Java) (0) | 2023.09.17 |
---|---|
[실버2] 1260. DFS와 BFS (Java) (0) | 2023.09.17 |
[골드3] 1520. 내리막길 (0) | 2023.09.13 |
[실버1] 2667. 단지 번호 붙이기 (Java) (0) | 2023.09.12 |
[실버2] 11724. 연결 요소의 개수(Java) (0) | 2023.09.11 |