새발블로그
[백준/Java] 21736 헌내기는 친구가 필요해 본문
문제
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 |