[백준] 문제 3187번 : 양치기 꿍 - JAVA
2024. 12. 6. 22:55 - DoosanBaek
[링크] : https://www.acmicpc.net/problem/3187
💎 문제 분석 & 제약 조건
문제 분석 :
주어진 농장 지도에서 양과 늑대의 위치를 파악하고,
서로 다른 영역에서 양과 늑대의 수를 세어 양이 늑대보다 많으면 양이 살아남고,
늑대가 양보다 많으면 늑대가 살아남는다.
제약 조건 :
농장의 크기는 R x C (1 ≤ R, C ≤ 250)
각 칸은 빈 칸, 양, 늑대, 울타리로 구성된다.
🚀 의사 결정
1.농장 지도를 2차원 배열로 입력받는다.
2. BFS를 사용하여 각 영역을 탐색하고, 양과 늑대의 수를 센다.
3. 각 영역에서 양과 늑대의 수에 따라 결과를 계산한다.
📜 소스코드(Java)
import java.io.*;
import java.util.*;
public class Main {
static int R, C; // 농장의 크기 (행, 열)
static char[][] farm; // 농장 지도
static boolean[][] visited; // 방문 여부를 체크하는 배열
// 이동 방향 정의 (상, 하, 좌, 우)
static int[] dx = {-1, 1, 0, 0};
static int[] dy = {0, 0, -1, 1};
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
// 농장의 크기 R(행)과 C(열)을 입력받음
String[] dimensions = br.readLine().split(" ");
R = Integer.parseInt(dimensions[0]);
C = Integer.parseInt(dimensions[1]);
// 농장 지도와 방문 여부 배열 초기화
farm = new char[R][C];
visited = new boolean[R][C];
// 농장 지도 입력 처리
for (int i = 0; i < R; i++) {
farm[i] = br.readLine().toCharArray(); // 한 줄씩 입력받아 문자 배열로 변환하여 저장
}
int totalSheep = 0; // 총 양의 수
int totalWolves = 0; // 총 늑대의 수
// 농장 지도를 탐색하여 각 영역의 양과 늑대 수를 계산
for (int i = 0; i < R; i++) {
for (int j = 0; j < C; j++) {
// 방문하지 않았고 울타리가 아닌 경우에만 탐색
if (!visited[i][j] && farm[i][j] != '#') {
// BFS를 사용하여 현재 영역의 양과 늑대 수를 계산
int[] result = bfs(i, j);
int sheep = result[0];
int wolves = result[1];
// 양과 늑대의 수에 따라 결과를 업데이트
if (sheep > wolves) {
totalSheep += sheep;
} else {
totalWolves += wolves;
}
}
}
}
// 최종 결과 출력 (총 양의 수와 총 늑대의 수)
System.out.println(totalSheep + " " + totalWolves);
}
// BFS를 사용하여 각 영역을 탐색하고 양과 늑대의 수를 센다
static int[] bfs(int x, int y) {
Queue<int[]> queue = new LinkedList<>(); // BFS 큐 생성
queue.add(new int[] {x, y}); // 시작 지점을 큐에 추가
visited[x][y] = true; // 시작 지점을 방문 처리
int sheep = 0; // 현재 영역의 양의 수
int wolves = 0; // 현재 영역의 늑대 수
// 시작 지점에 있는 양과 늑대의 수 체크
if (farm[x][y] == 'k') sheep++;
if (farm[x][y] == 'v') wolves++;
// 큐가 빌 때까지 BFS 탐색
while (!queue.isEmpty()) {
int[] current = queue.poll(); // 큐에서 현재 노드 꺼내기
int cx = current[0];
int cy = current[1];
// 상하좌우 인접한 노드 탐색
for (int i = 0; i < 4; i++) {
int nx = cx + dx[i];
int ny = cy + dy[i];
// 유효한 범위 내에 있고, 방문하지 않았으며 울타리가 아닌 경우
if (nx >= 0 && nx < R && ny >= 0 && ny < C && !visited[nx][ny] && farm[nx][ny] != '#') {
visited[nx][ny] = true; // 방문 처리
queue.add(new int[] {nx, ny}); // 큐에 추가
// 인접한 지점에 있는 양과 늑대의 수 체크
if (farm[nx][ny] == 'k') sheep++;
if (farm[nx][ny] == 'v') wolves++;
}
}
}
return new int[] {sheep, wolves}; // 현재 영역의 양과 늑대 수 반환
}
}
'알고리즘' 카테고리의 다른 글
[백준] 문제 2644 번 : 촌수 계산 - JAVA (0) | 2024.12.07 |
---|---|
[백준] 문제 2805번 : 나무 자르기 - JAVA (0) | 2024.12.07 |
[백준] 문제 24444번 : 알고리즘 수업 - 너비 우선 탐색 1 - JAVA (0) | 2024.12.07 |
[백준] 문제 24479번 : 깊이 우선 탐색 1 - JAVA (0) | 2024.12.07 |
[백준] 문제 2210번 : 숫자판 점프 - JAVA (0) | 2024.12.06 |
[백준] 문제 13116 : 30번 - JAVA (0) | 2024.12.06 |
[백준] 문제 9934번 : 완전이진트리 - JAVA (0) | 2024.12.06 |
[백준] 문제 9372번 : 상근이의 여행 - JAVA (1) | 2024.12.05 |