새발블로그

[백준/Java] 21736 헌내기는 친구가 필요해 본문

Problem Solving/Baekjoon

[백준/Java] 21736 헌내기는 친구가 필요해

EUG 2025. 7. 1. 15:36

문제

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

풀이방법

맵 입력받기
BFS를 도연이(I부터)
BFS이동공간은 O일 때 (조건에 X가 아닐 때 추가해줘야함)
BFS중 다음 탐색 경로가 P이면 만날 사람 수 카운팅 해주기
카운트수가 0이면 TT 출력

풀이

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

public class Main {
    public static int bfs(int N, int M, int[] cur, char[][] campus, boolean[][] visited, int pCnt) {
        //동 북 서 남
        int[] dx = {0, 1, 0, -1};
        int[] dy = {1, 0, -1, 0};

        Queue<int[]> q = new ArrayDeque<>();
        q.add(cur);

        while (!q.isEmpty()) {
            int curX = q.peek()[0];
            int curY = q.peek()[1];
            visited[curX][curY] = true;
            q.poll();

            for (int i = 0; i<4; i++) {
                int nextX = curX + dx[i];
                int nextY = curY + dy[i];
                //그래프 조건
                if (nextX >= 0 && nextY >= 0 && nextX < N && nextY < M) {
                    //이 떄 탐색
                    if (!visited[nextX][nextY] && campus[nextX][nextY] != 'X') {
                        if (campus[nextX][nextY] == 'P') {
                            pCnt++;
                        }
                        q.add(new int[]{nextX, nextY});
                        visited[nextX][nextY] = true;
                    }
                }
            }
        }
        return pCnt;
    }

    public static void main(String[] args) throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        int N = Integer.parseInt(st.nextToken());
        int M = Integer.parseInt(st.nextToken());

        char[][] campus = new char[N][M];
        boolean[][] visited = new boolean[N][M];
        int pCnt = 0;


        for (int i = 0; i<N; i++) {
            String line = br.readLine();
            campus[i] = line.toCharArray();
        }
        for (int i = 0; i<N; i++) {
            for (int j = 0; j<M; j++) {
                if (campus[i][j]=='I') {
                    pCnt = bfs(N, M, new int[]{i, j}, campus, visited, pCnt);
                }
            }
        }
        if (pCnt > 0) {
            System.out.println(pCnt);
        } else {
            System.out.println("TT");

        }
    }
}

 

 

'Problem Solving > Baekjoon' 카테고리의 다른 글

[백준/Java] 1967 트리의 지름  (0) 2025.07.01
[백준/Java] 2579 계단 오르기  (0) 2025.07.01
[백준/Java] 10026 적록색약  (0) 2025.07.01
[백준/Java] 1260 DFS와 BFS  (0) 2025.07.01
[백준/Java] 2467 용액  (0) 2025.07.01