양 3184번 [17일차]
시간제한 | 메모리 제한 |
1초 | 128MB |
문제
미키의 뒷마당에는 특정 수의 양이 있다. 그가 푹 잠든 사이에 배고픈 늑대는 마당에 들어와 양을 공격했다.
마당은 행과 열로 이루어진 직사각형 모양이다. 글자 '.' (점)은 빈 필드를 의미하며, 글자 '#'는 울타리를, 'o'는 양, 'v'는 늑대를 의미한다.
한 칸에서 수평, 수직만으로 이동하며 울타리를 지나지 않고 다른 칸으로 이동할 수 있다면, 두 칸은 같은 영역 안에 속해 있다고 한다. 마당에서 "탈출"할 수 있는 칸은 어떤 영역에도 속하지 않는다고 간주한다.
다행히 우리의 양은 늑대에게 싸움을 걸 수 있고 영역 안의 양의 수가 늑대의 수보다 많다면 이기고, 늑대를 우리에서 쫓아낸다. 그렇지 않다면 늑대가 그 지역 안의 모든 양을 먹는다.
맨 처음 모든 양과 늑대는 마당 안 영역에 존재한다.
아침이 도달했을 때 살아남은 양과 늑대의 수를 출력하는 프로그램을 작성하라.
입력
첫 줄에는 두 정수 R과 C가 주어지며(3 ≤ R, C ≤ 250), 각 수는 마당의 행과 열의 수를 의미한다.
다음 R개의 줄은 C개의 글자를 가진다. 이들은 마당의 구조(울타리, 양, 늑대의 위치)를 의미한다.
출력
하나의 줄에 아침까지 살아있는 양과 늑대의 수를 의미하는 두 정수를 출력한다.
나의코드
package day17;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Stack;
// 양 - 3184번
public class Solution4 {
static int[] dx = {1,-1,0, 0};
static int[] dy = {0,0,1, -1};
static String[][] yard; //마당의 배열
static boolean[][] visited;
static int totalSheep = 0; // 총 양
static int totalWolves = 0; // 총 늑대
static int maxCount;
public static void main(String[] args) throws IOException {
// . 필드 / # 울타리 / o 양 / v 늑대
// 수평 수직으로만 이동가능 - 울타리를 지나지 않은다면 같은칸으로 간주
// 탈출 칸은 count하지않음
// 영역안의 양의 수가 늑대의 수보다 많다면 이김
// 반대라면 늑대가 잡아먹음
// 탐색 - 영역안에 늑대와 양의 수
// R C 마당의 행과 열
// 탐색중 v를 만난다면 v count
// o를 만난다면 o count
// 영역 탐색이 끝나면 o와 c의 수를 비교
// 큰 수의 동물을 count
// 출력
// 양과 늑대의 수
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String[] lineBr = br.readLine().split(" ");
// 사각형 너비
int R = Integer.parseInt(lineBr[0]);
int C = Integer.parseInt(lineBr[1]);
yard = new String[R][C];
visited = new boolean[R][C];
// 배열 채우기
for(int i = 0;i < yard.length;i++){
String str = br.readLine();
for(int j = 0;j < yard[0].length;j++){
yard[i][j] = str.substring(j,j+1);
}
}
// 탐색
// 모든 좌표에서 dfs 시작
for(int i = 0;i < yard.length;i++){
for(int j = 0;j < yard[0].length;j++){
if (!visited[i][j] && !yard[i][j].equals("#")) {
int[] result = dfs(i, j);
if (result[0] > result[1]) {
totalSheep += result[0];
} else {
totalWolves += result[1];
}
}
}
}
System.out.println(totalSheep + " " + totalWolves);
}
static int[] dfs(int startX, int startY){
int sheepCount = 0;
int wolfCount = 0;
Stack<int[]> stack = new Stack<>();
stack.push(new int[]{startX, startY});
visited[startX][startY] = true;
while (!stack.isEmpty()){
int[] now = stack.pop();
int x = now[0];
int y = now[1];
if (yard[x][y].equals("o")) {
sheepCount++;
} else if (yard[x][y].equals("v")) {
wolfCount++;
}
for (int i = 0; i < 4; i++) {
int nx = x + dx[i];
int ny = y + dy[i];
boolean withinBounds = nx >= 0 && ny >= 0 && nx < yard.length && ny < yard[0].length;
if (withinBounds && !visited[nx][ny] && !yard[nx][ny].equals("#")) {
visited[nx][ny] = true;
stack.push(new int[]{nx, ny});
}
}
}
return new int[]{sheepCount, wolfCount};
}
}
이번 문제는 dfs의 stack을 이용해 문제를 풀어보았다.
사실 큐를 사용할때와 방법은 동일한거 같다.
자료구조에 위치를 담아주고 빌때까지 계속 해서 탐색한다.
문제에 나오는 조건들만 조금씩 달라지고 완전탐색으로 문제를 푸는 방법은 비슷한거 같다!
'Algorithm > 코딩테스트' 카테고리의 다른 글
[코딩테스트] 백준 - 구호물자 (3) | 2024.08.06 |
---|---|
[코딩테스트] 백준 - 숨바꼭질 (0) | 2024.08.06 |
[코딩테스트] 백준 - 음식물 피하기 (0) | 2024.08.05 |
[코딩테스트] 백준 - 영상처리 (0) | 2024.08.05 |
[코딩테스트] 백준 - 침투 (0) | 2024.08.05 |