๋ฐ์ํ
๋ฌธ์ (Gold 3)
https://www.acmicpc.net/problem/11967
ํ์ด
ํ์์ ์ธ์ , ์ด๋์์ ํ๋์ง๊ฐ ๊ต์ฅํ ์ค์ํ ๋ฌธ์ !
์ฐ์ , ๋ ์ด์ ์ํ ๋ณ๊ฒฝ์ด ์์ ๋๊น์ง ํ์์ ๋ฐ๋ณตํ๋ค.
ํ์ ์ฝ๋
- cangoTmp: ํ์ํ๊ธฐ ์ ์ ์ํ๋ฅผ ์ ์ฅํด ๋๋๋ค.
- ํ์ํ ๊ณณ์์ ์ค์์น๋ฅผ ์ผค ์ ์๋ ๊ณณ์ cango๊ฐ์ true๋ก ๋ณ๊ฒฝํ๋ค.
- BFS ํ์์ ๋๊ณ , ํ์ํ ๊ณณ์์ map์ List๋ฅผ ๋๋ฉฐ ๊ณ์ํด์ ์ค์์น๋ฅผ ์ผ ๋ค
- ํ์ ์ ๊ณผ ๋ค๋ฅธ ์ํ๋ผ๋ฉด, ์๋ก ๊ฐ ์ ์๋ ๊ณณ์ด ์๊ฒผ๋ค๋ ์๋ฏธ !
์ฆ, ํ๋ฒ ๋ ํ์์ ํด์ผํ๋ฏ๋ก true๋ฅผ ๋ฆฌํดํ๋ค.
์ฝ๋
๋๋ณด๊ธฐ
package graphTraversal;
import java.io.*;
import java.util.*;
public class BOJ_11967_๋ถ์ผ๊ธฐ {
static int[] di = {-1, 0, 1, 0};
static int[] dj = {0, -1, 0, 1};
static int N;
static List<int[]>[][] map; // ์ฐ๊ฒฐ๋์ด ์๋ ์ค์์น ์ ๋ณด๋ค์ List๋ก ์ ์ฅ
static boolean[][] cango;
public static void main(String[] args) throws Exception{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken());
int M = Integer.parseInt(st.nextToken());
map = new List[N][N];
cango = new boolean[N][N];
for(int i =0 ; i < N ; i++)
for(int j =0 ; j < N ; j++)
map[i][j] = new ArrayList<>();
for(int i =0 ; i < M ; i++){
st = new StringTokenizer(br.readLine());
int x1 = Integer.parseInt(st.nextToken())-1;
int y1 = Integer.parseInt(st.nextToken())-1;
int x2 = Integer.parseInt(st.nextToken())-1;
int y2 = Integer.parseInt(st.nextToken())-1;
map[x1][y1].add(new int[]{x2, y2});
}
while(turnOn()){} // ๋์ด์ ์ํ ๋ณ๊ฒฝ์ด ์์ ๋๊น์ง ํ์ ์ง์
int cnt = 0;
for(int i =0 ; i < N ; i++){
for(int j =0 ;j < N ; j++){
if(cango[i][j]) cnt++;
}
}
System.out.println(cnt);
}
private static boolean turnOn() {
boolean[][] cangoTmp = new boolean[N][N];
for(int i =0 ; i < N ; i++) cangoTmp[i] = Arrays.copyOf(cango[i], cango[i].length);
Queue<int[]> q = new ArrayDeque<>();
boolean[][] visited = new boolean[N][N];
q.offer(new int[]{0,0});
visited[0][0] = true;
cango[0][0] = true;
for(int[] i : map[0][0]) cango[i[0]][i[1]] = true;
while(!q.isEmpty()){
int[] cur = q.poll();
for(int d =0 ; d < 4 ; d++){
int ni = cur[0] + di[d];
int nj = cur[1] + dj[d];
if(0<=ni&&ni<N && 0<=nj&&nj<N){
if(!visited[ni][nj] && cango[ni][nj]){
for(int[] i : map[ni][nj]) cango[i[0]][i[1]] = true; // ์ค์์น ์ผ๊ธฐ
visited[ni][nj] = true;
q.offer(new int[]{ni, nj});
}
}
}
}
// ํ์ ์ ๊ณผ ๋ค๋ฅธ ์ํ๋ผ๋ฉด, ํ๋ฒ ๋ ํ์์ ํด์ผํจ!
for(int i =0 ; i < N ; i++){
for(int j = 0 ; j < N ; j++){
if(cangoTmp[i][j] != cango[i][j]) return true;
}
}
return false;
}
}
์ ์ถ
์ ๋๋ก ํ์ด์ 2ํธ๋ง์ ์ฑ๊ณต!
์ฒ์์ ํ์์ด ํ๋ฒ ๋๋๋ฉด ๋ฐ๋ก ๊ฒฐ๊ณผ๋ฅผ ์ถ๋ ฅํ๋ค -> ๋ง์ ์๊ฐ ์๋ ์ฝ๋..ใ _ใ
๋ฐ์ํ
'๐ ์๊ณ ๋ฆฌ์ฆ > GraphTraversal' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[LeetCode] 802. Find Eventual Safe States (ํด์, kotlin ํ์ด) (0) | 2023.07.12 |
---|---|
[๋ฐฑ์ค] 14466๋ฒ: ์๊ฐ ๊ธธ์ ๊ฑด๋๊ฐ ์ด์ 6 (JAVA) (0) | 2022.03.28 |
[๋ฐฑ์ค] 3184๋ฒ ์ (Java) (0) | 2022.02.16 |
[๋ฐฑ์ค] 5427๋ฒ ๋ถ (Java) (0) | 2022.02.08 |
[๋ฐฑ์ค] 2606๋ฒ ๋ฐ์ด๋ฌ์ค (Java) (0) | 2021.08.24 |