https://www.acmicpc.net/problem/17142
ํ์ด๊ณผ์
0. ์ ๋ ฅ์ ๋ฐ์ ๋ ์ฑ์์ผ ํ ๋น์นธ์ ๊ฐฏ์๋ฅผ ์ ์ฅํฉ๋๋ค.
1. ๋ฐฑํธ๋ํน์ ํ์ฉํด์ ๋ฐ์ด๋ฌ์ค๋ค์ ์กฐํฉ์ ์ ํํฉ๋๋ค.
2. ์ ํ๋ ๋ฐ์ด๋ฌ์ค๋ค์ ๋ํด bfs๋ฅผ ์ํํ์ฌ ํผํธ๋ฆฝ๋๋ค.
- ๋ฐ์ด๋ฌ์ค๋ฅผ ํผํธ๋ฆด ๋, ๋น์นธ๊ณผ ๋ฐ์ด๋ฌ์ค๊ฐ ์๋ ์นธ์ ๋ํด ๊ตฌ๋ถํด์ ์ฝ๋๋ฅผ ์์ฑํด์ผ ํฉ๋๋ค.
- ๋น ์นธ์ ๊ฒฝ์ฐ 0๋ฒ ํ์ด๊ณผ์ ์์ ์ ์ฅํ ๋ชฉํ์ ๋น๊ตํ๊ธฐ ์ํด cnt๊ฐ์ ์ฆ๊ฐ์์ผ ์ค๋๋ค.
- ๋ฐ์ด๋ฌ์ค์ ๊ฒฝ์ฐ cnt ๊ฐ์ ์ฆ๊ฐ์ํค์ง ์๊ณ ๋ฐฉ๋ฌธ์ฒ๋ฆฌ์ bfsํ์ ๋ฃ๋ ๋์๋ง ์ํํฉ๋๋ค.
์ฒ์์๋ swea์ ์ง๋ขฐ๋ฌธ์ ์ ํท๊ฐ๋ ค์ ๋ฐ์ด๋ฌ์ค๋ฅผ ๋ง๋๋ฉด ๊ณ์ ํผ์ง๋๋ก ๊ตฌํํด์ ๊ณ์ ํ๋ ธ์ต๋๋ค ใ ใ
3. ๋น ์นธ์ ๋ค ์ฑ์ ์ผ๋ฉด ์ด๋ํ ์๊ฐ์ return ํฉ๋๋ค.
- bfs์์ ์๊ฐ์ ๊ณ์ ์ปค์ง๊ฒ ๋์ด, ์ฒ์ ๋น ์นธ์ ๋ค ์ฑ์ด๊ฒฝ์ฐ๊ฐ ์ต๋จ ์๊ฐ์ ๋๋ค.
4. ์ด๋ ๋น ์นธ์ด ํ๋๋ ์๋ ์ ๋ ฅ์ด ์ฃผ์ด์ง ๊ฒฝ์ฐ์ ๋ํด์ ์์ธ์ฒ๋ฆฌ๋ฅผ ํด์ค์ผ ํฉ๋๋ค.
์์ธ์ฒ๋ฆฌ๋ฅผ ํด์ฃผ์ง ์์ผ๋ฉด ์ ๋ต์ด 0์ด ์๋ 1์ด ๋์ค๊ฒ ๋ฉ๋๋ค.
์๊ฒ๋ ์
- list์ removeํจ์๋ ์ธ๋ฑ์ค์ ๋ํด์ ๋์ํ๋ฉฐ, ๊ฐ์ฒด์ ๋ํด์๋ ๋์ํฉ๋๋ค.
- ๋ฐฑํธ๋ํน์ ํ์ฉํ ์กฐํฉ ๊ตฌํ์ ๋ค์ ์ตํ ์ ์์์ต๋๋ค.
์ ์ฒด์ฝ๋
package com.mincheolsong;
import java.util.*;
import java.io.*;
public class Main {
static int N,M;
static int[][] arr;
static List<int[]> virus;
static List<int[]> selected;
static int goal;
static int[] dr = {-1,0,1,0};
static int[] dc = {0,1,0,-1};
static boolean[][] visited;
static final int INF = (int)1e9;
static int ans;
static int[] bfs(List<int[]> list){
Deque<int[]> q = new ArrayDeque<>();
visited = new boolean[N][N];
int cnt = 0;
for(int i=0;i<list.size();i++){ // ์ ํํ ๋ฐ์ด๋ฌ์ค๋ค bfsํ์ ๋ฃ๊ธฐ
int[] p = list.get(i);
q.offer(new int[]{p[0],p[1],0}); // ํ,์ด,์๊ฐ
visited[p[0]][p[1]]=true;
}
while(!q.isEmpty()){
int[] c = q.pollFirst();
int cr = c[0];
int cc = c[1];
int sec = c[2];
for(int d=0;d<4;d++){
int nr = cr + dr[d];
int nc = cc + dc[d];
if(nr<0 || nr>=N) continue;
if(nc<0 || nc>=N) continue;
if(arr[nr][nc]==1) continue;
if(visited[nr][nc]){
continue;
}
// ๋ฐ์ด๋ฌ์ค์ธ ๊ฒฝ์ฐ๋ ๊ทธ๋ฅ ๋ฐฉ๋ฌธ์ฒ๋ฆฌ ํ๊ณ ํ์ ๋ฃ์ด์ค
if(arr[nr][nc]==0){ // ๋น ์นธ์ ๋ฐฉ๋ฌธํ ๊ฒฝ์ฐ ๊ฐฏ์ ์ธ๊ธฐ
cnt+=1;
}
visited[nr][nc]=true;
q.offer(new int[]{nr,nc,sec+1});
if(cnt==goal){ // ๋น ์นธ์ ๋ค ์ฑ์ ์ผ๋ฉด ๊ทธ ๋๊ฐ ์ต๋จ์๊ฐ ์ด๋ฏ๋ก return (bfs์ sec๋ ๊ณ์ ์ฆ๊ฐํจ)
return new int[]{cnt,sec+1};
}
}
}
return new int[]{-1,-1};
}
static void solve(int n,int start){ // ์กฐํฉ
if(n==M){
int[] result = bfs(selected); // ์ ํ๋ ๋ฐ์ด๋ฌ์ค๋ค์ ๋ํด์ bfs
if(result[0]==goal){ // ๋น ์นธ์ ๋ค ์ฑ์ด๊ฒฝ์ฐ
ans = Math.min(ans,result[1]); // ์ต์๊ฐ ๊ฐฑ์
}
return;
}
for(int i=start;i<virus.size();i++){
selected.add(virus.get(i));
solve(n+1,i+1);
selected.remove(selected.size()-1);
}
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken());
M = Integer.parseInt(st.nextToken());
virus = new ArrayList<>();
selected = new ArrayList<>();
goal = 0;
arr = new int[N][N];
ans = INF;
for(int i=0;i<N;i++){
st = new StringTokenizer(br.readLine());
for(int j=0;j<N;j++){
int input = Integer.parseInt(st.nextToken());
arr[i][j] = input;
if(arr[i][j]==2){ // ๋ฐ์ด๋ฌ์ค
virus.add(new int[]{i,j});
}else if(arr[i][j]==0){ // 0์ธ ๊ณณ (์ฑ์์ผ ํ ๋น์นธ์ ๊ฐฏ์ ์ธ๊ธฐ)
goal+=1;
}
}
}
if(goal==0){ // ๋น์นธ์ด ํ๋๋ ์๋ ๊ฒฝ์ฐ ์ ๋ต์ 0
ans = 0;
}else{
solve(0,0);
}
System.out.println(ans==INF?-1:ans);
}
}
'๐์ฝ๋ฉํ ์คํธ:CodingTest' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๋ฃจ๋ํ์ ๋ฐ๋(์ผ์ฑ sw์ญ๋ํ ์คํธ) (0) | 2024.04.10 |
---|---|
[๋ฐฑ์ค] ์ํ ๋๋ฆฌ๊ธฐ (0) | 2024.04.09 |
๋ฐฐ์ด ์๊ณ๋ฐฉํฅ ํ์ ๊ณต์ (1) | 2024.04.06 |
ํฌํฌ์ธํฐ ์๊ณ ๋ฆฌ์ฆ (0) | 2024.04.05 |
[๋ฐฑ์ค] ๋๋๊ณค ์ปค๋ธ (๊ตฌํ) (0) | 2024.04.05 |