https://www.acmicpc.net/problem/21736
21736번: 헌내기는 친구가 필요해
2020년에 입학한 헌내기 도연이가 있다. 도연이는 비대면 수업 때문에 학교에 가지 못해 학교에 아는 친구가 없었다. 드디어 대면 수업을 하게 된 도연이는 어서 캠퍼스 내의 사람들과 친해지고
www.acmicpc.net
저는 BFS를 통해 해당 문제를 해결하였습니다.
P점부터 시작하여 BFS를 해 벽쪽으로는 진행하지 않고 빈 공간과 친구쪽은 BFS를 진행하도록 하였습니다.
package BOJ.bfs;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;
import java.util.function.Function;
public class BOJ_21736 {
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
Function<String,Integer> stoi = Integer::parseInt;
int n = stoi.apply(st.nextToken());
int m = stoi.apply(st.nextToken());
char[][] input = new char[n][m];
int startY = 0;
int startX = 0;
for(int i = 0 ; i < n ; i++){
String command = br.readLine();
for(int j = 0 ; j < m ; j++){
input[i][j] = command.charAt(j);
if(input[i][j] == START){
startY = i;
startX = j;
}
}
}
int friendCnt = bfs(startY,startX,input,n,m);
if(friendCnt == 0){
System.out.println("TT");
}else{
System.out.println(friendCnt);
}
}
private static final char START = 'I';
private static final char FRIEND = 'P';
private static final char WALL = 'X';
private static final char EMPTY = 'O';
private static final int[] DY = {-1,0,1,0};
private static final int[] DX = {0,1,0,-1};
private static int bfs(int startY,int startX, char[][] input, int n, int m) {
Queue<int[]> q = new LinkedList<>();
q.offer(new int[] {startY,startX});
boolean[][] visited = new boolean[n][m];
visited[startY][startX] = true;
int friendCnt = 0;
while(!q.isEmpty()){
int[] now = q.poll();
if(input[now[0]][now[1]] == FRIEND){
friendCnt++;
}
for(int i = 0 ; i < 4; i++){
int ny = now[0] + DY[i];
int nx = now[1] + DX[i];
if(checkBound(ny,nx,n,m) && !visited[ny][nx] && input[ny][nx] != WALL){
visited[ny][nx] = true;
q.offer(new int[] {ny,nx});
}
}
}
return friendCnt;
}
private static boolean checkBound(int y,int x,int n,int m){
if(y >= 0 && y < n && x >= 0 && x < m){
return true;
}
return false;
}
}
'알고리즘' 카테고리의 다른 글
백준 13334번 철로 (JAVA) (0) | 2022.08.01 |
---|---|
백준 14940번 쉬운 최단거리 (JAVA) (0) | 2022.07.31 |
백준 20010번 악덕 영주 혜유 (JAVA) (0) | 2022.07.29 |
백준 9658번 돌 게임4 (JAVA) (0) | 2022.07.28 |
백준 2688번 줄어들지 않아 (JAVA) (0) | 2022.07.27 |