본문 바로가기
PS 문제 풀이/Baekjoon

[BOJ] 백준 3184 양

by 까망 하르방 2021. 2. 23.
반응형

출처: https://www.acmicpc.net/problem/3184

 Input 

9 12

.###.#####..

#.oo#...#v#.

#..o#.#.#.#.

#..##o#...#.

#.#v#o###.#.

#..#v#....#.

#...v#v####.

.####.#vv.o#

.......####.

 

 Output 

3 5

① 배열을 순회하면 울타리가 아닌 지역에서 BFS

② BFS를 하며 같은 영역 안에 있는 양과 늑대 수 확인

③ 살아남은 쪽을 결과값에 저장


import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;
 
public class Main {
     
    static int R, C;
    static int[] dx = {-1, 1, 0, 0};
    static int[] dy = {0, 0, -1, 1};
    static char[][] map;
    static boolean[][] visited;
    static int sheep = 0, wolf = 0;
     
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
         
        R = Integer.parseInt(sc.next());
        C = Integer.parseInt(sc.next());
         
        map = new char[R][C];
        for(int r=0; r<R; r++) {
            String str = sc.next();
            for(int c=0; c<C; c++) {
                map[r][c] = str.charAt(c);
            }
        }
         
        visited = new boolean[R][C];
         
        for(int r=0; r<R; r++) {
            for(int c=0; c<C; c++) {
                // 방문하지 않은 양,늑대, 혹은 단순 필드이면
                if(!visited[r][c] && !(map[r][c] == '#')) BFS(new Vertex(r, c));
            }
        }
        System.out.println(sheep + " " + wolf);
    }
     
    /*
     . : 필드
     # : 울타리
     o : 양
     v : 늑대
     */
    private static void BFS(Vertex vertex) {
        // 해당 영역의 늑대와 양의 수
        int s = 0, w = 0;
        Queue<Vertex> queue = new LinkedList<>();
 
 
        // 양인지 늑대인지 확인하여 마릿수 check
        if(map[vertex.x][vertex.y] == 'o' ) s++;
        else if(map[vertex.x][vertex.y] == 'v' ) w++;
         
        // 방문 표시
        visited[vertex.x][vertex.y] = true;
         
        // 해당 지점을 시작으로 BFS 탐색
        queue.offer(vertex);
        while(!queue.isEmpty()) {
            Vertex v = queue.poll();
            for(int i=0; i<4; i++) {
                int nX = v.x + dx[i];
                int nY = v.y + dy[i];
                 
                // map 범위 내에서
                if(nX >= 0 && nY >= 0 && nX < R && nY < C) {
                    // 울타리이거나 이미 방문한 곳이면
                    if(visited[nX][nY] || map[nX][nY] == '#') continue;
                     
                    // 양인 경우
                    if(map[nX][nY] == 'o') s++;
                    // 늑대인 경우
                    else if(map[nX][nY] == 'v') w++;
                     
                    // 방문 표시
                    visited[nX][nY] = true;
                    // BFS
                    queue.offer(new Vertex(nX, nY));
                }
            }
        }
 
        // 양과 늑대가 존재하지 않은 경우
        if(s == 0 && w == 0) return;
         
          // 양이 늑대보다 많은 경우
        if(s > w) sheep += s;
        else wolf += w;
    }
 
 
    static class Vertex{
        int x, y;
         
        public Vertex(int x, int y) {
            this.x = x;
            this.y = y;
        }
    }
}

 

반응형

'PS 문제 풀이 > Baekjoon' 카테고리의 다른 글

[BOJ] 백준 6064 카잉 달력  (0) 2021.02.23
[BOJ] 백준 2108 통계학  (0) 2021.02.23
[BOJ] 백준 2606 바이러스  (0) 2021.02.23
[BOJ] 백준 1449 수리공 항승  (0) 2021.02.23
[BOJ] 백준 12851 숨바꼭질 2  (0) 2021.02.23

댓글