J

[JAVA] BOJ ๋ฐฑ์ค€ 1941 ์†Œ๋ฌธ๋‚œ ์น ๊ณต์ฃผ ๋ณธ๋ฌธ

๐Ÿ”‘ Problem Solving/๐Ÿ‡ BOJ

[JAVA] BOJ ๋ฐฑ์ค€ 1941 ์†Œ๋ฌธ๋‚œ ์น ๊ณต์ฃผ

snowball๐Ÿฐ 2023. 4. 12. 13:19

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

 

1941๋ฒˆ: ์†Œ๋ฌธ๋‚œ ์น ๊ณต์ฃผ

์ด 25๋ช…์˜ ์—ฌํ•™์ƒ๋“ค๋กœ ์ด๋ฃจ์–ด์ง„ ์—ฌํ•™์ƒ๋ฐ˜์€ 5×5์˜ ์ •์‚ฌ๊ฐํ˜• ๊ฒฉ์ž ํ˜•ํƒœ๋กœ ์ž๋ฆฌ๊ฐ€ ๋ฐฐ์น˜๋˜์—ˆ๊ณ , ์–ผ๋งˆ ์ง€๋‚˜์ง€ ์•Š์•„ ์ด๋‹ค์†œ๊ณผ ์ž„๋„์—ฐ์ด๋ผ๋Š” ๋‘ ํ•™์ƒ์ด ๋‘๊ฐ์„ ๋‚˜ํƒ€๋‚ด๋ฉฐ ๋‹ค๋ฅธ ํ•™์ƒ๋“ค์„ ํœ˜์–ด์žก๊ธฐ ์‹œ์ž‘

www.acmicpc.net

๐Ÿ’ก ๋ถ€๋ถ„์ง‘ํ•ฉ๊ณผ BFS๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜์˜€๋‹ค.
1. ๋ถ€๋ถ„ ์ง‘ํ•ฉ์„ ํ†ตํ•ด 5X5 ์ขŒํ‘œ์—์„œ 7๊ฐœ๋ฅผ ๊ณจ๋ผ์ค€๋‹ค.
2. ์ด๋•Œ 'Y'์˜ ๊ฐœ์ˆ˜๊ฐ€ 3๊ฐœ์ด์ƒ์ด๋ฉด return ํ•ด์ค€๋‹ค.
3. 7๊ฐœ๋ฅผ ๊ณจ๋ผ์ฃผ๋ฉด BFS๋ฅผ ํ†ตํ•ด ์„œ๋กœ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋Š”์ง€ ํ™•์ธํ•ด์ค€๋‹ค.

์ „์ฒด ์ฝ”๋“œ

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

public class Main {
	static char[][] classroom;
	static int result;
	static int[] dx = {0, 1, 0, -1}, dy = {1, 0, -1, 0};
    public static void main(String args[]) throws Exception{
    	BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
    	classroom = new char[5][5];
    	for(int i=0; i<5; i++) {
    		String s = bf.readLine();
    		for(int j=0; j<5; j++)
    			classroom[i][j] = s.charAt(j);
    	}
    	subset(0, 0, 0, 0);
    	System.out.println(result);
    }
    static boolean[][] v = new boolean[5][5];
    static void subset(int x, int y, int yeon, int count) {
    	if(yeon >= 4 || count > 7) return;
    	boolean[][] visited = new boolean[5][5];
    	if(x==4&& y==5) {
    		ArrayDeque<int[]> q = new ArrayDeque<>();
    		f: for(int i=0; i<5; i++)
    			for(int j=0; j<5; j++)
    				if(v[i][j]) {
    					q.offer(new int[] {i, j});
    					visited[i][j] = true;
    					break f;
    				}
    		int cnt = 1;
    		while(!q.isEmpty()) {
    			int[] now = q.poll();
    			for(int d=0; d<4; d++) {
    				int nx = now[0]+dx[d];
    				int ny = now[1]+dy[d];
    				if(nx<0||ny<0||nx>=5||ny>=5|| (!v[nx][ny]) || visited[nx][ny]) continue; // v๋Š” ์„ ํƒ๋œ ์ขŒํ‘œ๋งŒ์„ visited๋Š” ํ™•์ธ๋œ ์ขŒํ‘œ์ธ์ง€ ๊ฒ€์‚ฌ
    				cnt++;
    				visited[nx][ny] = true;
    				q.offer(new int[] {nx, ny});
    			}
    		}
    		if(cnt == 7) // ์—ฐ๊ฒฐ๋œ๊ฒƒ์ด 7๊ฐœ๋ผ๋ฉด 7๊ฐœ๊ฐ€ ์„œ๋กœ ์ „๋ถ€ ์—ฐ๊ฒฐ๋˜์–ด์žˆ๋‹ค๋Š” ๋œป
    			result++;
    		return;
    	}
    	if(y==5) {
    		subset(x+1, 0, yeon, count);
    		return;
    	}
    	v[x][y] = true;
    	if(classroom[x][y] == 'S') // Y์ธ ๊ฒฝ์šฐ yeon ์ฆ๊ฐ€, ์•„๋‹ˆ๋ฉด ๊ทธ๋Œ€๋กœ
    		subset(x, y+1, yeon, count+1);
    	else
    		subset(x, y+1, yeon+1, count+1);
    	v[x][y] = false;
    	subset(x, y+1, yeon, count);
    }
}
Comments