백준

백준 16956번 늑대와 양 (java)

대기업 가고 싶은 공돌이 2024. 8. 6. 23:32

[Silver III] 늑대와 양 - 16956

문제 링크

성능 요약

메모리: 31292 KB, 시간: 296 ms

분류

애드 혹, 해 구성하기

제출 일자

2024년 8월 6일 23:25:20

문제 설명

크기가 R×C인 목장이 있고, 목장은 1×1 크기의 칸으로 나누어져 있다. 각각의 칸에는 비어있거나, 양 또는 늑대가 있다. 양은 이동하지 않고 위치를 지키고 있고, 늑대는 인접한 칸을 자유롭게 이동할 수 있다. 두 칸이 인접하다는 것은 두 칸이 변을 공유하는 경우이다.

목장에 울타리를 설치해 늑대가 양이 있는 칸으로 갈 수 없게 하려고 한다. 늑대는 울타리가 있는 칸으로는 이동할 수 없다. 울타리를 설치해보자.

입력

첫째 줄에 목장의 크기 R, C가 주어진다.

둘째 줄부터 R개의 줄에 목장의 상태가 주어진다. '.'는 빈 칸, 'S'는 양, 'W'는 늑대이다.

출력

늑대가 양이 있는 칸으로 갈 수 없게 할 수 있다면 첫째 줄에 1을 출력하고, 둘째 줄부터 R개의 줄에 목장의 상태를 출력한다. 울타리는 'D'로 출력한다. 울타리를 어떻게 설치해도 늑대가 양이 있는 칸으로 갈 수 있다면 첫째 줄에 0을 출력한다.

풀이

우선 예제 출력이 굉장히 이상한 문제다. 울타리가 세워지는 기준이 전혀 없는 예제가 나와 도저히 어떻게 풀어야할지 감이잡히지 않았다.

 

굉장히 생각을 오래 해보다 구글 검색을 한 결과 예제 출력과 똑같은 출력이 아니어도 전부 정답으로 인정된다고 한다 ,,,

 

단순하게 늑대를 찾고 늑대 상하좌우에 울타리를 설치하는 방식으로 문제를 풀었더니 바로 맞췄다,,, 

예제와 같지 않아도 정답 처리가 되는 문제는 처음이라 굉장히 당황스러웠다 ,,

 

전체 코드

public class Main {

    static int N, M,a[] = {-1,1,0,0}, b[] = {0,0,-1,1};
    static char x[][];

    public static void main(String args[])throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        StringTokenizer st = new StringTokenizer(br.readLine());
        N = Integer.parseInt(st.nextToken());
        M = Integer.parseInt(st.nextToken());

        x = new char[N][M];

        for(int  i = 0 ;i<N;i++){
            x[i] = br.readLine().toCharArray();
        }

        for(int  i = 0;i<N;i++){
            for(int  j = 0 ;j<M;j++){
                if(x[i][j] == 'W'){
                    if(!check(i,j)){
                        bw.write("0");
                        bw.flush();
                        return;
                    }
                }
            }
        }

        bw.write("1\n");

        for(int  i = 0 ;i<N;i++){
            for(int j = 0; j<M; j++){
                bw.write(String.valueOf(x[i][j]));
            }
            bw.write("\n");
        }
        bw.flush();
    }


    public static boolean check(int i ,int j){
        for(int k = 0;k<4;k++){
            int X = i + a[k];
            int Y = j + b[k];
            if(X < N && X>=0 && Y >= 0 && Y < M){
                if(x[X][Y] == '.'){
                    x[X][Y] = 'D';
                }
                if(x[X][Y] == 'S'){
                    return false;
                }
            }
        }

        return  true;

    }
}

'백준' 카테고리의 다른 글

백준 1012번 유기농 배추 (java)  (0) 2024.08.08
백준 1260번 DFS와 BFS (java)  (0) 2024.08.08
백준 10451번 순열 사이클 (java)  (0) 2024.08.05
백준 2664번 촌수계산 (java)  (0) 2024.08.05
백준 2606번 바이러스(java)  (0) 2024.08.04