πŸ“ μ•Œκ³ λ¦¬μ¦˜/GraphTraversal

[λ°±μ€€] 3184번 μ–‘ (Java)

점이 2022. 2. 16. 00:33
λ°˜μ‘ν˜•

문제 (Silver 2)

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

 

3184번: μ–‘

첫 μ€„μ—λŠ” 두 μ •μˆ˜ Rκ³Ό Cκ°€ 주어지며(3 ≤ R, C ≤ 250), 각 μˆ˜λŠ” λ§ˆλ‹Ήμ˜ ν–‰κ³Ό μ—΄μ˜ 수λ₯Ό μ˜λ―Έν•œλ‹€. λ‹€μŒ R개의 쀄은 C개의 κΈ€μžλ₯Ό 가진닀. 이듀은 λ§ˆλ‹Ήμ˜ ꡬ쑰(μšΈνƒ€λ¦¬, μ–‘, λŠ‘λŒ€μ˜ μœ„μΉ˜)λ₯Ό μ˜λ―Έν•œλ‹€.

www.acmicpc.net


풀이

1. μ–‘ λ˜λŠ” λŠ‘λŒ€κ°€ μžˆλŠ” μ˜μ—­μ„ 검사 (BFS)

2. κ·Έλž˜ν”„λ₯Ό 돌며 μ–‘κ³Ό λŠ‘λŒ€μ˜ μœ„μΉ˜ μ €μž₯

3. 탐색 ν›„, μ–‘κ³Ό λŠ‘λŒ€ 리슀트 크기 비ꡐ ν›„ map에 반영

μ½”λ“œ

더보기
import java.util.*;
import java.io.*;

public class Main {
    static int[] di = {-1,0,1,0};
    static int[] dj = {0,-1,0,1};
    static int R,C;
    static char[][] map;
    static boolean[][] visited ;
    static List<int[]> sheep, inSheep;
    static List<int[]> wolf, inWolf;
    public static void main(String[] args) throws Exception{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());

        R = Integer.parseInt(st.nextToken());
        C = Integer.parseInt(st.nextToken());
        map = new char[R][C];
        visited = new boolean[R][C];
        sheep = new ArrayList<>();  // μ˜μ—­ λ‚΄ μ–‘μ˜ μœ„μΉ˜ μ €μž₯
        wolf = new ArrayList<>(); // μ˜μ—­ λ‚΄ λŠ‘λŒ€ μœ„μΉ˜ μ €μž₯

        for(int i =0 ; i < R ; i++){
            String str = br.readLine();
            for(int j =0 ; j < C ; j++){
                map[i][j] = str.charAt(j);
            }
        }

        for(int i =0 ; i < R ; i++){
            for(int j = 0 ; j < C ; j++){
                if(map[i][j] == 'v' || map[i][j] == 'o'){ // λŠ‘λŒ€μ™€ 양을 λ§Œλ‚œλ‹€λ©΄
                    wolf = new ArrayList<>();
                    sheep = new ArrayList<>();
                    attack(i, j);	// μ˜μ—­ 검사 
                    if(wolf.size() < sheep.size()){	// μ–‘μ˜ μˆ˜κ°€ 더 λ§Žμ„ λ•Œ
                        for(int[] w : wolf){
                            map[w[0]][w[1]] = '.';	// λŠ‘λŒ€ μœ„μΉ˜ κ°’ λ³€κ²½
                        }
                    }else{
                        for(int[] s : sheep){	// λŠ‘λŒ€ μˆ˜κ°€ 더 λ§Žμ„ λ•Œ
                            map[s[0]][s[1]] = '.';	// μ–‘μ˜ μœ„μΉ˜ κ°’ λ³€κ²½
                        }
                    }
                }
            }
        }

        int wolfCnt = 0;
        int sheepCnt = 0;

        for(int i =0 ; i < R ; i++){
            for(int j =0 ; j < C ;j++){
                if(map[i][j] == 'v') wolfCnt ++;
                else if(map[i][j] == 'o') sheepCnt++;
            }
        }

        System.out.println(sheepCnt+" "+wolfCnt);
    }

	/* μ˜μ—­ 검사λ₯Ό μœ„ν•œ BFS */
    private static void attack(int i, int j) {
        Queue<int[]> q = new ArrayDeque<>();
        q.offer(new int[]{i, j});
        visited[i][j] = true;

        while(!q.isEmpty()){
            int[] cur = q.poll();

            if(map[cur[0]][cur[1]] == 'v'){
                wolf.add(new int[]{cur[0], cur[1]});
            }
            else if(map[cur[0]][cur[1]] == 'o') {
                sheep.add(new int[]{cur[0], cur[1]});
            }

            for(int d = 0 ; d < 4 ; d++){
                int ni = cur[0] + di[d];
                int nj = cur[1] + dj[d];
                if(0<=ni&&ni<R && 0<=nj&&nj<C){
                    if(!visited[ni][nj] && map[ni][nj] != '#'){
                        q.offer(new int[]{ni, nj});
                        visited[ni][nj] = true;
                    }
                }
            }
        }
    }
}
λ°˜μ‘ν˜•