반응형
[문제링크]
https://www.acmicpc.net/problem/21736
[문제]
2020년에 입학한 헌내기 도연이가 있다. 도연이는 비대면 수업 때문에 학교에 가지 못해 학교에 아는 친구가 없었다. 드디어 대면 수업을 하게 된 도연이는 어서 캠퍼스 내의 사람들과 친해지고 싶다.
도연이가 다니는 대학의 캠퍼스는 N×M 크기이며 캠퍼스에서 이동하는 방법은 벽이 아닌 상하좌우로 이동하는 것이다. 예를 들어, 도연이가 (x , y )에 있다면 이동할 수 있는 곳은 (x+1 , y ), (x , y+1 ), (x−1 , y ), (x , y−1 )이다. 단, 캠퍼스의 밖으로 이동할 수는 없다.
불쌍한 도연이를 위하여 캠퍼스에서 도연이가 만날 수 있는 사람의 수를 출력하는 프로그램을 작성해보자.
[입력]
첫째 줄에는 캠퍼스의 크기를 나타내는 두 정수 N (1≤N≤600 ), M (1≤M≤600 )이 주어진다.
둘째 줄부터 N 개의 줄에는 캠퍼스의 정보들이 주어진다. O는 빈 공간, X는 벽, I는 도연이, P는 사람이다. I가 한 번만 주어짐이 보장된다.
[출력]
첫째 줄에 도연이가 만날 수 있는 사람의 수를 출력한다. 단, 아무도 만나지 못한 경우 TT를 출력한다.
[예제 입력 1]
3 5
OOOPO
OIOOX
OOOXP
[예제 출력 1]
1
[예제 입력 2]
3 3
IOX
OXP
XPP
[예제 출력 2]
TT
[설명]
이 문제도 기본적인 BFS문제로 보인다.공간인지, 사람인지, 벽인지를 판단하여 사람을 만나게 되면 +1을 해주고,
친구를 만들 수 없다면 TT를 출력해주면 된다.
백준 알고리즘 21736번 JAVA풀이
import java.util.*;
public class BJ21736 {
public static int[][] arr;
public static boolean[][] visited;
private static int[] dr = {-1,0,1,0};
private static int[] dc = {0,1,0,-1};
private static int answer = 0;
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
String[] s = sc.nextLine().split(" ");
int r = Integer.parseInt(s[0]);
int c = Integer.parseInt(s[1]);
arr = new int[r][c];
visited = new boolean[r][c];
int ir=0;
int ic=0;
// 배열 입력 받기
for(int i=0;i<r;i++){
String st = sc.nextLine();
for(int j=0;j<c;j++){
if(st.charAt(j)=='O'){ // 공간
arr[i][j] = 0;
}else if(st.charAt(j)=='I'){ // 본인
arr[i][j] = 1;
ir=i;
ic=j;
}else if(st.charAt(j)=='P'){ // 사람
arr[i][j] = 2;
}else if(st.charAt(j)=='X'){ // 벽
arr[i][j] = 3;
}
}
}
Queue<Node> q = new LinkedList<>();
q.add(new Node(ir,ic));
visited[ir][ic]=true;
while(!q.isEmpty()){
for(int i=0;i<q.size();i++) {
Node n = q.poll();
for(int d=0;d<4;d++){
int nr = n.r + dr[d];
int nc = n.c + dc[d];
if(isChecked(nr,nc, r, c)){
if(!visited[nr][nc]){
if(arr[nr][nc]==0) {
q.add(new Node(nr, nc));
visited[nr][nc]=true;
}
if(arr[nr][nc]==2){
q.add(new Node(nr, nc));
answer++;
arr[nr][nc]=0;
visited[nr][nc]=true;
}
}
}
}
}
}
if(answer!=0) {
System.out.println(answer);
}else {
System.out.println("TT");
}
}
public static boolean isChecked(int nr, int nc, int r, int c){
return nr>=0 && nc>=0 && nr<r && nc<c;
}
public static class Node{
int r;
int c;
public Node(int r, int c){
this.r=r;
this.c=c;
}
}
}
궁금하신 부분이나 부족한 점은 댓글로 알려주시면 감사하겠습니다.
'알고리즘 > DFS_BFS' 카테고리의 다른 글
BJ S3 2606 바이러스 -Java (0) | 2024.10.09 |
---|---|
BJ S2 11724 연결요소의개수 - Java (2) | 2024.10.09 |
BJ G5 7569 토마토 - Java (1) | 2024.10.01 |
BJ_G4_14502_연구소 - Java (0) | 2022.10.07 |
BJ_S2_10819_차이를최대로 - Java (0) | 2022.06.08 |
댓글