백준

[백준_16956번] 늑대와 양

빙수빈수 2021. 8. 24. 20:43

https://www.acmicpc.net/problem/16956

 

16956번: 늑대와 양

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

www.acmicpc.net

[문제]

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

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

 

[입력 조건]

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

 

[코드]

import java.util.*;

/*
 * 해당 문제는 설치할 울타리의 최소 갯수를 구하는 것이 아니기 때문에
 * 울타리의 개수 상관없이 늑대가 양이 있는 칸에 못가게 만들면 된다.
 * 즉, 늑대의 상,하,좌,우 칸에 양이 없으면 늑대는 양에 갈 수 없기 때문에 해당 칸들에 울타리를 설치하면 된다.
 */
public class BaekJoon_16956 {
	static char[][] map;
	static int r,c;
	static int[] dx= {-1,1,0,0};
	static int[] dy= {0,0,-1,1};
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner sc=new Scanner(System.in);
		r=sc.nextInt();
		c=sc.nextInt();
		map=new char[r][c];
		
		for(int i=0;i<r;i++) {
			String str=sc.next();
			for(int j=0;j<c;j++) {
				map[i][j]=str.charAt(j);
			}
		}
		
		boolean flag=true; 
		for(int i=0;i<r;i++) {
			for(int j=0;j<c;j++) {
				
				// 해당 칸에 늑대가 있다면 상,하,좌,우 탐색
				if(map[i][j]=='W') {
					for(int k=0;k<4;k++) {
						int nx=i+dx[k];
						int ny=j+dy[k];
						
						// 배열 범위를 벗어난 경우 넘어간다.
						if(nx>=r||ny>=c||nx<0||ny<0)
							continue;
						
						/*
						 * 늑대가 이동할 수 있는 칸에 양이 있으면 
						 * 울타리를 어떻게 설치해도 늑대가 양이있는 칸에 갈 수 있는 경우
						 */
						if(map[nx][ny]=='S')
							flag=false;
						
						/*
						 * 늑대가 이동할 수 있는 칸에 양들이 없고
						 * 늑대의 상,하,좌,우 모든 칸에 울타리를 설치한다면 
						 * 늑대는 절대로 양이 있는 칸으로 갈 수 없다. 
						 */
						if(map[nx][ny]=='.')
							map[nx][ny]='D';
					}
				}
			}
		}
		
		// 울타리를 어떻게 설치해도 늑대가 양이있는 칸에 갈 수 있는 경우
		if(flag==false)
			System.out.println(0);
		// 아니라면 맵 출력
		else {
			System.out.println(1);
			for(int i=0;i<r;i++) {
				for(int j=0;j<c;j++) {
					System.out.print(map[i][j]);
				}
				System.out.println();	
			}
				
		}
	}

}

 

[고찰]

 이번 문제는 설치할 수 있는 울타리의 개수가 최소가 되게하는 문제가 아니라서 난이도가 낮은 것 같다. 위의 코드는 늑대의 주변에 울타리를 설치하여 늑대가 양에게 접근할 수 없도록 한 것이다. 이때 인접한 칸으로 이동할 수 있는 늑대가 양이 있는 칸으로 이동할 수 없는 경우는 인접한 칸에 양이 없는 경우이다. 즉, 늑대가 있는 칸의 상, 하, 좌, 우 칸들을 탐색했을 때 양이 있다면 해당 경우는 울타리를 어떻게 설치해도 늑대가 양에 접근할 수 있다. 

 해당 문제에 울타리의 개수의 최솟값을 구하라고 제시했다면 좀 더 어려운 문제가 됐을 것 같다. 

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

[백준_5014번] 스타트링크  (0) 2021.08.25
[백준_15664번] N과 M (10)  (0) 2021.08.24
[백준_18429번] 근손실  (0) 2021.08.23
[백준_20291번] 파일 정리  (0) 2021.08.23
[백준_1956번] 운동  (0) 2021.08.23