Algorithm/백준
[백준] 3184 양
SSONGMI
2021. 3. 26. 20:02
반응형
문제 출처: www.acmicpc.net/problem/3184
3184번: 양
첫 줄에는 두 정수 R과 C가 주어지며(3 ≤ R, C ≤ 250), 각 수는 마당의 행과 열의 수를 의미한다. 다음 R개의 줄은 C개의 글자를 가진다. 이들은 마당의 구조(울타리, 양, 늑대의 위치)를 의미한다.
www.acmicpc.net
: 각 영역에서 양이 늑대보다 많은 경우에는 양만 살아남고, 늑대가 양의 수와 같거나 많으면 늑대만 살아남는다.
: 아침에 도달했을 때 살아남는 양과 늑대의 수를 구해야 한다.
: BFS 방식으로 접근하는데 해당 칸이 울타리(#)가 아닌 경우에만 탐색하도록 한다.
: 그 안에서 늑대와 양의 수를 세고 탐색이 끝날 때 누구의 수가 더 많은지 보고 살아남는 동물의 수에 더해준다.
package algo;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;
public class 양 {
static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
static StringBuilder sb = new StringBuilder();
static StringTokenizer st;
static int N, M;
static char[][] map;
static boolean[][] visited;
static class Point{
int r, c;
public Point(int r, int c) {
super();
this.r = r;
this.c = c;
}
}
public static void main(String[] args) throws NumberFormatException, IOException {
st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken());
M = Integer.parseInt(st.nextToken());
map = new char[N][M];
visited = new boolean[N][M];
for(int i = 0; i < N; i++) {
String[] tmp = br.readLine().split("");
for(int j = 0; j < M; j++) {
map[i][j] = tmp[j].charAt(0);
}
}
// for(char [] sub : map) System.out.println(Arrays.toString(sub));
for(int i = 0; i < N; i++) {
for(int j = 0; j < M; j++) {
if(!visited[i][j] && map[i][j] != '#') Decide(i, j);
}
}
System.out.println(sheep + " " + wolf);
}
static int[] dr = {-1, 1, 0, 0};
static int[] dc = {0, 0, -1, 1};
static int sheep = 0;
static int wolf = 0;
private static void Decide(int r, int c) {
Queue<Point> q = new LinkedList<>();
q.offer(new Point(r, c));
visited[r][c] = true;
int o = 0;
int v = 0;
while(!q.isEmpty()) {
Point p = q.poll();
// System.out.println("nr = "+ p.r +", nc = " + p.c + ", map = " + map[p.r][p.c]);
if(map[p.r][p.c] == 'o') o++;
if(map[p.r][p.c] == 'v') v++;
for(int i = 0; i < 4; i++) {
int nr = p.r + dr[i];
int nc = p.c + dc[i];
if(nr < 0 || nr >= N || nc < 0 || nc >= M || map[nr][nc] == '#' || visited[nr][nc]) continue;
visited[nr][nc] = true;
q.offer(new Point(nr, nc));
}
}
// System.out.println("o = " + o +", v = " + v);
if(o > v) sheep += o;
else if(v >= o) wolf += v;
}
}
반응형