알고리즘

[백준, 자바, 21736번] 헌내기는 친구가 필요해

hminor 2024. 12. 6. 16:49
반응형

풀이

  • 해당 문제는 간단히 BFS로 해결했으며
  • 따로 특별하거나 그런 문제는 아니였음
  • 다만 벽이 아닌 사람이 있는 경우에도 해당 위치에 방문할 수 있는지
  • 한 번 읽었을 때는 이해가 가지 않아 
  • 두 번 읽으니 벽이 아니면 갈 수 있다는 것을 확인하여 간단히 해결.

 

import java.io.*;
import java.util.*;

public class _21736 {
    static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    static String[][] mtx;
    static boolean[][] visit;
    static Deque<int[]> dq = new ArrayDeque<>();
    public static void main(String[] args) throws IOException {
        StringTokenizer st = new StringTokenizer(br.readLine());
        int N = Integer.parseInt(st.nextToken());
        int M = Integer.parseInt(st.nextToken());
        mtx = new String[N][M];
        visit = new boolean[N][M];
        addMtx(N,M);
        int result = findPeople(N,M);
        System.out.println(result==0?"TT":result);
    }

    private static void addMtx(int N, int M) throws IOException {
        for (int i=0; i<N; i++) {
            String inp = br.readLine();
            for (int j=0; j<M; j++) {
                mtx[i][j]=String.valueOf(inp.charAt(j));
                if (mtx[i][j].equals("I")) dq.add(new int[]{i,j});
            }
        }
    }

    private static int findPeople(int N, int M) {
        int cnt = 0;
        int[] ni = {-1,0,1,0};
        int[] nj = {0,1,0,-1};
        while (!dq.isEmpty()) {
            int[] now = dq.pollFirst();
            for (int i=0; i<4; i++) {
                if ((0<=now[0]+ni[i]&&now[0]+ni[i]<N) && (0<=now[1]+nj[i]&&now[1]+nj[i]<M) &&
                        !mtx[now[0]+ni[i]][now[1]+nj[i]].equals("X") && !visit[now[0]+ni[i]][now[1]+nj[i]]) {
                    dq.add(new int[]{now[0]+ni[i],now[1]+nj[i]});
                    visit[now[0]+ni[i]][now[1]+nj[i]]=true;
                    if (mtx[now[0]+ni[i]][now[1]+nj[i]].equals("P")) cnt++;
                }
            }
        }
        return cnt;
    }
}