예은이의 이것저것
[백준 18428] 감시 피하기 in JAVA 본문
18428번: 감시 피하기
NxN 크기의 복도가 있다. 복도는 1x1 크기의 칸으로 나누어지며, 특정한 위치에는 선생님, 학생, 혹은 장애물이 위치할 수 있다. 현재 몇 명의 학생들은 수업시간에 몰래 복도로 빠져나왔는데, 복
www.acmicpc.net

※ 풀이 방법
먼저 아무것도 없는 위치 중 세 곳을 골라 장애물을 설치해주었다 -> 백트래킹
장애물이 설치된 곳이 세 곳이 되면 학생들이 감시를 피할 수 있는지 체크해주었다.
각 케이스별로 체크해서 학생들이 감시를 피할 수 있는 케이스가 하나라도 있다면 YES 출력, 하나도 없으면 NO를 출력했다.
원래는 학생들의 위치를 따로 저장하려고 했으나 학생은 최대 30명, 선생님은 최대 5명 있기 때문에 선생님의 위치를 따로 저장했다.
※ 문제 풀이 코드
import java.util.Scanner;
public class BOJ_18428 {
public static String [][] arr;
public static int ans=0;
public static int [][] T;
public static int t;
public static void ck(int N) {
int x,y,cnt=0;//학생이 걸린 횟수
for(int i=0;i<t;i++) {
x=T[i][0];
y=T[i][1];
for(int j=x-1;j>=0;j--) {//상
if(arr[j][y].equals("S")) cnt++;
if(arr[j][y].equals("O")) break;
}
for(int j=x+1;j<N;j++) {//하
if(arr[j][y].equals("S")) cnt++;
if(arr[j][y].equals("O")) break;
}
for(int j=y-1;j>=0;j--) {//좌
if(arr[x][j].equals("S")) cnt++;
if(arr[x][j].equals("O")) break;
}
for(int j=y+1;j<N;j++) {//우
if(arr[x][j].equals("S")) cnt++;
if(arr[x][j].equals("O")) break;
}
}
if(cnt==0) ans++;
}
public static void bt(int n,int r,int c,int N) {
if(r>=N||c>=N) return;//범위 벗어났을 경우
if(n==3) {//장애물 3개 모두 설치했을 경우
ck(N);//학생이 걸리는지 체크
return;
}
for(int i=0;i<N;i++) {
for(int j=0;j<N;j++) {
if(arr[i][j].equals("X")) {//arr[i][j]가 빈자리라면(학생 x, 선생 x, 장애물 x)
arr[i][j]="O";//장애물 설치
bt(n+1,i,j,N);//다음 위치 확인
arr[i][j]="X";//장애물 해제
}
}
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner input=new Scanner(System.in);
int N=input.nextInt();
arr=new String[10][10];
T=new int[10][2];
t=0;
for(int i=0;i<N;i++) {
for(int j=0;j<N;j++) {
arr[i][j]=input.next();
if(arr[i][j].equals("T")) {//선생님 위치 저장
T[t][0]=i;
T[t][1]=j;
t++;
}
}
}
bt(0,0,0,N);
//학생이 안 걸린 경우가 한 번이라도 있으면 YES 출력, 그렇지 않으면 NO 출력
if(ans==0) System.out.println("NO");
else System.out.println("YES");
}
}
'나는 컴공이다 > Algorithm in JAVA' 카테고리의 다른 글
| [백준 3665] 최종 순위 in JAVA (0) | 2021.02.08 |
|---|---|
| [백준 1697] 숨바꼭질 in JAVA (0) | 2021.02.04 |
| [백준 18352] 특정 거리의 도시 찾기 in JAVA (0) | 2021.02.01 |
| [백준 20500] Ezreal 여눈부터 가네 ㅈㅈ in JAVA (0) | 2021.01.25 |
| [백준 10825] 국영수 in JAVA (0) | 2021.01.24 |