본문 바로가기

ALGORITHM

백준 3187 양치기 꿍 (Java)

1. 문제 링크

 

3187번: 양치기 꿍

입력의 첫 번째 줄에는 각각 영역의 세로와 가로의 길이를 나타내는 두 개의 정수 R, C (3 ≤ R, C ≤ 250)가 주어진다. 다음 각 R줄에는 C개의 문자가 주어지며 이들은 위에서 설명한 기호들이다.

www.acmicpc.net

 

2. 문제 및 입출력예제

 

3. 문제 풀이

모든 곳을 돌면서 방문하지 않은 곳 중 양이나 늑대가 있는 곳에서 양의 수와 늑대의 수를 0으로 초기화하고 BFS 탐색을 한다.

시작 지점을 큐에 넣고 BFS 탐색을 시작한다.

큐에서 뺀 곳이 늑대일 경우 늑대의 값을 증가하고, 양일 경우 양의 수를 증가한다.

BFS를 끝내고 다시 왔을 때, 양이 많으면 양만 살아남고, 나머지의 경우에는 늑대만 살아남는다.

 

4. 코드

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayDeque;
import java.util.Queue;

public class Main {
	static int N, M, s, w;
	static char[][] map;
	static boolean[][] visit;
	static int[] dx = {0,0,-1,1}, dy = {-1,1,0,0};
    
	public static void main(String[] args) throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		String[] split = br.readLine().split(" ");
		N = Integer.parseInt(split[0]);
		M = Integer.parseInt(split[1]);
		
		map = new char[N][M];
		visit = new boolean[N][M];
		for(int i=0;i<N;i++) {
			String str = br.readLine();
			for(int j=0;j<M;j++) {
				map[i][j] = str.charAt(j);
			}
		}
		
		int sheep = 0, wolf = 0;
		for(int i=0;i<N;i++) {
			for(int j=0;j<M;j++) {
				//방문하지 않은 곳 중에서 양이나 늑대가 있는 곳
				if(!visit[i][j] && (map[i][j]=='v' || map[i][j] == 'k')) {
					//값 초기화
					s = 0;
					w = 0;
					bfs(i, j);
					if(s>w) { //양이 많으면 양만 살아남음
						sheep += s;
					}
					else {
						wolf += w;
					}
				}
			}
		}
		System.out.println(sheep+" "+wolf);
	}
	
	private static void bfs(int i, int j) {		
		Queue<int[]> queue = new ArrayDeque<>();
		queue.offer(new int[]{i, j});
		visit[i][j] = true;
		
		while(!queue.isEmpty()) {
			int[] now = queue.poll();
			int x = now[0];
			int y = now[1];
			if(map[x][y] == 'v') { //늑대일 경우
				w++;
			}
			else if(map[x][y] == 'k') { //양일 경우
				s++;
			}
			for(int d=0;d<4;d++) {
				int X = x+dx[d];
				int Y = y+dy[d];
				if(X<0 || X>=N || Y<0 ||Y>=M ||visit[X][Y] ||map[X][Y] == '#') {
					continue;
				}
				queue.offer(new int[] {X, Y});
				visit[X][Y] = true;
			}
		}
	}
	
}

 

'ALGORITHM' 카테고리의 다른 글

백준 14620 꽃길 (Java)  (0) 2023.06.14
백준 1965 상자넣기 (Java)  (0) 2023.06.13
백준 16139 인간-컴퓨터 상호작용  (0) 2023.06.11
백준 15685 드래곤 커브 (Java)  (0) 2023.06.10
백준 1915 가장 큰 정사각형 (Java)  (0) 2023.06.09