카테고리 없음

BOJ_16956_늑대와 양

꼬꼬랑내 2021. 9. 15. 07:54

1. 

구분: 그래프 이론, 그래프 탐색, 너비 우선 탐색, 애드 혹,구성적 
언어: Java
전략: 
BFS를 통해 전체 그래프를 탐색하면서 늑대가 이동해서 갈 수 있는 곳을 막는다.

늑대를 기준으로(늑대를 큐에 넣어) 늑대와 인접하고, 또 그 것이 양과 인접하는지 찾아서 그 곳을 울타리로 막는다

1. 인접한 것이 S - 내가 '.' 이면 D삽입 / 내가 W면 답이 없음

2. 인접한 것이 '.' 이면 큐에 삽입

3. 인접한 것이 W면 지나가  


2. 코드

import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;
public class Main {
	
	static class Node{
		int y; 
		int x;
		Node(int y, int x){
			this.y = y;
			this.x = x;
		}
	}

	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		//높이와 너비 
		int h = scanner.nextInt();
		int w = scanner.nextInt();
		
		Queue<Node> q = new LinkedList<>();
		
		//양과 늑대 배열을 받을 문자형 배열
		char[][] map = new char[h][w];
		//방문여부를 확인하는 boolean
		boolean[][] check = new boolean[h][w];
		for(int i = 0; i<h; i++) {
			String str = scanner.next();
			for(int j = 0; j<w; j++) { 
				map[i][j]= str.charAt(j);
				if(map[i][j] == 'W') { //늑대는 일단 뷰에 넣고, 방문 처리
					q.offer(new Node(i,j));
					check[i][j] = true;
				}
			}
		}
		//4방 탐색
		int[] dx = {1,-1,0,0};
		int[] dy = {0,0,1,-1};
		
		boolean isok = true;
		
		loop:while(!q.isEmpty()) {
			Node node = q.poll();
			int px = node.x;
			int py = node.y;
			
			for(int d = 0; d<4; d++) {
				int nx = px + dx[d];
				int ny = py + dy[d];
				
				//범위를 살핀다.
				if(nx<0 || ny<0 || nx>=w || ny>=h)continue;

				//늑대면 그냥 패스 
				if(map[ny][nx]=='W') continue;
				
				//방문한 적이 없고, .인 경우 - 큐에 삽입
				if(!check[ny][nx]&&map[ny][nx]=='.') {
					q.offer(new Node(ny, nx));
					check[ny][nx] = true;
				}
				//인접한게 양인 경우 
				if(!check[ny][nx] && map[ny][nx]=='S') {
					//만약 이떄 내가 원래 늑대였으면 끝! - 노답
					if(map[py][px]=='W') {
						isok = false;
						break loop;
					}//근데 내가 .이야 그럼 이곳에 울타리 설치 
					if(map[py][px]=='.')
						map[py][px] = 'D';
					q.offer(new Node(ny, nx));
					check[ny][nx] = true;
				}				
			}//4방탐색			
		}//while문
		
		if(!isok) System.out.println(0); //노답이면 0 출력
		else {//아니면 전체 배열 출력
			System.out.println(1);
			for(int i = 0; i<h; i++) {
				for(int j = 0; j<w; j++) {
					System.out.print(map[i][j]);
				}
				System.out.println();
			}
			
		}
		

	}//main

}

3

  • 어떤 방식으로 늑대를 울타리로 막으면 된다.
  • 테스트 케이스와 답이 계속 달라 많이 고민했지만, 문제에 최소의 개수로 울타리를 두는게 아니라 했기 때문에 완벽한 정답은 없다. (테스트 케이스에도 늑대가 없는데 울타리를 설치하기도 했다.)
  • 다만 최적화를 시키는 방법을 찾아야 한다. (최소한의 울타리 사용)