문제 - https://www.acmicpc.net/problem/18428

 

18428번: 감시 피하기

NxN 크기의 복도가 있다. 복도는 1x1 크기의 칸으로 나누어지며, 특정한 위치에는 선생님, 학생, 혹은 장애물이 위치할 수 있다. 현재 몇 명의 학생들은 수업시간에 몰래 복도로 빠져나왔는데, 복

www.acmicpc.net

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

public class Main {

    static BufferedReader br= new BufferedReader(new InputStreamReader(System.in));
    static BufferedWriter bw= new BufferedWriter(new OutputStreamWriter(System.out));
    static StringBuilder sb = new StringBuilder();
    static StringTokenizer st;

    static int N;
    static boolean can = false;
    static char[][] Class;
    static class Point{
        int r, c;
        public Point(int r, int c){
            this.r = r;
            this.c = c;
        }
    }
    static ArrayList<Point> Ts = new ArrayList<>();
    static ArrayList<Point> Xs = new ArrayList<>();

    public static void main(String[] args) throws Exception {

        N = Integer.parseInt(br.readLine());
        Class = new char[N][N];
        for (int i = 0; i < N; i++) {
            st = new StringTokenizer(br.readLine());
            for (int j = 0; j < N; j++) {
                Class[i][j] = st.nextToken().charAt(0);
                if (Class[i][j]=='X')
                    Xs.add(new Point(i, j));
                else if (Class[i][j]=='T')
                    Ts.add(new Point(i, j));
            }
        }
        fill(0, 3);
        sb.append(can? "YES" : "NO");

        bw.write(sb.toString());
        bw.flush();
        bw.close();
        br.close();
    }
    static void fill(int s, int remain){
        if(can)
            return;
        if (remain==0){
            chk();
            return;
        }
        for (int i = s; i < Xs.size(); i++) {
            Point cur = Xs.get(i);
            Class[cur.r][cur.c] = 'O';
            fill(i+1, remain-1);
            Class[cur.r][cur.c] = 'X';
        }
    }
    static void chk(){
        int r, c;
        for (Point t : Ts){
            r = t.r-1;
            c = t.c;
            while(0<=r && r<N && 0<=c && c<N){
                if(Class[r][c]=='O' || Class[r][c]=='T') break;
                else if(Class[r][c]=='S') return;
                r--;
            }
            r = t.r;
            c = t.c+1;
            while(0<=r && r<N && 0<=c && c<N){
                if(Class[r][c]=='O' || Class[r][c]=='T') break;
                else if(Class[r][c]=='S') return;
                c++;
            }
            r = t.r+1;
            c = t.c;
            while(0<=r && r<N && 0<=c && c<N){
                if(Class[r][c]=='O' || Class[r][c]=='T') break;
                else if(Class[r][c]=='S') return;
                r++;
            }
            r = t.r;
            c = t.c-1;
            while(0<=r && r<N && 0<=c && c<N){
                if(Class[r][c]=='O' || Class[r][c]=='T') break;
                else if(Class[r][c]=='S') return;
                c--;
            }
        }
        can = true;
    }
}

백트랙킹을 이용하면 단순하게 풀 수 있는 문제였다.

딱 실버연습용으로 좋을듯

'공부 > algorithm' 카테고리의 다른 글

BOJ 단어 수학(1339) - Java  (0) 2021.09.28
BOJ 미세먼지 안녕!(17144) - Java  (0) 2021.09.25
BOJ 탈출(3055) - Java  (0) 2021.09.15
BOJ LCA 2(11438) - Java  (0) 2021.09.13
BOJ AC(5430) - Java  (0) 2021.09.13

+ Recent posts