![[BOJ] ๋ฐฑ์ค 31782 ์ ์ฒด์จ์ฆ (JAVA)](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdna%2FbM4Q6h%2FbtsG47KdFG8%2FAAAAAAAAAAAAAAAAAAAAAELvIz0ZyJk045KMqBmjJZPtzQwBGWBPS0xXviCAV65A%2Fimg.png%3Fcredential%3DyqXZFxpELC7KVnFOS48ylbz2pIh7yKj8%26expires%3D1761922799%26allow_ip%3D%26allow_referer%3D%26signature%3D67bYzQGL5OfL%252Fa6kDWX1NWvpMzY%253D)

๐ ๋ฌธ์

๐ฑ ์์ด๋์ด
๋ฎ, ๋ฐค ๊ด๋ จ BFS๋ฅผ ๊ฐ๊ฐ ๊ตฌํํ๊ณ , "์๊ตฌ์ ์ธ ์ ์ฒด์จ์ฆ ํ์"๊ฐ ์๊ธฐ๋ ์กฐ๊ฑด์ ์ฐพ์๋ณด์.
์ ๋ฌธ์ ์ ํคํฌ์ธํธ๋ ๋ณผ๋์ฒด๋ก ์ ๊ฐ์กฐ๋์ด ์๋ค. ๋ฎ, ๋ฐค์ ๋๋ ์ ์๊ฐํด ๋ณด์
- ๋ฎ
"์ฒด์จ ํ๋ณต ๊ณผ์ ์ ๋ฎ ์ฌ์ด ์ถฉ๋ถํ ๋ง์ด ๋ฐ๋ณต๋ ์ ์๋ค."
์ด ๋ป์ ๋ค๋ฅธ ์ฌ๋์ด ์ฒด์จ์ด ํ๋ณต์ด ๋๋ค๋ฉด, ๊ทธ ์ฃผ๋ณ ์ฌ๋๋ ์ฐ์์ ์ผ๋ก ์ฒด์จ ํ๋ณต์ด ๊ฐ๋ฅํ๋ค๋ ๋ป์ด๋ค
์ฆ, ๋ฎ BFS๋ฅผ ํตํด ๋จ ํ ๋ฒ์ผ๋ก ๊ฐ๋ฅํ ๋ชจ๋ ์ฌ๋์ ํ๋ณต์์ผ์ผ ํ๋ค.
- ๋ฐค
K๋ช ๋งํผ ๋ฐค์๋ ์ ์ฒด์จ์ฆ ํ์๊ฐ ๋ฐ์ํ๋ค ๋จ "์ต์ ์ ๊ฒฝ์ฐ"๋ก ๋ฐ์ํ๋ค.
์ด ๋ฌธ์ ์์ ์ต์ ์ ๊ฒฝ์ฐ๋ ๋ฎ์ด ๋์ด๋ ํ๋ณต์ด ๋ถ๊ฐ๋ฅํ ์ ์ฒด์จ์ฆ ํ์์ด๋ค. ๊ทธ๋ ๋ค๋ฉด ์ด๋ค ์กฐ๊ฑด์์ ์ ์์ฒด์จ ํ์๊ฐ
์๊ตฌ์ ์ธ ์ ์ฒด์จ์ฆ์ผ๋ก ๋ณ๊ฒฝ๋๋์ง ์บ์นํด์ผ ํ๋ค.
๊ฐ์ฅ ๋จผ์ , ๋ฎ์์ ์ฒด์จ์ ํ๋ณตํ ๋ ์ ์์ฒด์จ์ฌ๋์ ์งํฉ์ ์ฌ๊ฐํ์ ๊ทธ๋ฆด ์๋ฐ์ ์๋ค.
์ ์์ฒด์จ์ด ๋๋ ค๋ฉด ์, ํ, ์ข, ์ฐ๋ก 2๋ช ์ ์ ์์ฒด์จ์ฌ๋์ด ์์ด์ผ ํ๋ค. ์ด ์กฐ๊ฑด์ ๋ง๊ฒ ํผ์น๋ค ๋ณด๋ฉด ์ฌ๊ฐํ์ ์งํฉ์ด ๋ง๋ค์ด์ง๋ค

์ ์ฌ์ง์ฒ๋ผ ์กฐ๊ฑด์ ๋ง๊ฒ ํ๋ณต์ ํ๋ค๋ฉด ์ด๋ฐ ๋ชจ์์ผ๋ก ํ๋ณต์ด ๋๋ค๋ ๊ฒ์ ์ ์ ์๋ค. ๊ทธ๋ ๋ค๋ฉด ์ด๋ป๊ฒ ํ๋ฉด
๋ค์ ๋ฎ์ด ๋์ด๋ ํ๋ณต๋์ง ์๋ ์๊ตฌ์ ์ธ ์ ์ฒด์จ์ฆ ํ์๋ฅผ ๋ง๋ค ์ ์์๊น?

K = 2 ์ผ ๋ K ๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ ์ฌ๊ฐํ์ ๋ณ์ ํ๋ ์ ๊ฑฐํ๋ค๋ฉด, ๊ทธ ๋ฐค๋ง๋ค ์ฌ๊ฐํ ์ ์ฒด๋ฅผ ์์จ ์ ์๋ค
์ฆ, ์๊ตฌ์ ์ธ ์ ์ฒด์จ์ฆ ํ์๋ฅผ ๋ง๋ค ์ ์๋ค
๋ฐ๋๋ก K ๋ณด๋ค ํฐ ๋ณ์ K๋งํผ ์์ค๋ค๋ฉด , ๊ฒฐ๊ตญ ์ ์ฒด์จ์ฆ ํ์ ์, ํ, ์ข, ์ฐ๋ก ์ ์์ฒด์จ ์ฌ๋์ด 2๋ช ์ด ์๊ฒ ๋์ด ๋ฎ์ ํ๋ณต์ ํ๋ค.
์ด ์ ์ ์๊ฐํ๋ฉฐ ๊ตฌํํด ๋ณด์!
๐ฑ ์ฝ๋ ๋ฐ ํ์ด
import java.io.*; | |
import java.util.*; | |
public class Main { | |
public static int N, M, K, answer; | |
public static int minX = 2001, minY = 2001, maxX, maxY; | |
public static char[][] arr1; | |
public static boolean[][] vi; | |
public static int[] dx = {0, 0, -1, 1}; | |
public static int[] dy = {-1, 1, 0, 0}; | |
public static Queue<node> qu = new LinkedList<>(); | |
public static class node { | |
int x, y; | |
public node(int x, int y) { | |
this.x = x; | |
this.y = y; | |
} | |
} | |
// ์ ์ฒด์จ์ฆ ํ์ ํ๋ณต ํ๋ณ | |
public static boolean isCanChange(int x, int y) { | |
int cnt = 0; | |
for (int i = 0; i < 4; i++) { | |
int nx = x + dx[i]; | |
int ny = y + dy[i]; | |
if (nx < 0 || ny < 0 || nx >= M || ny >= N) continue; | |
if (arr1[ny][nx] == 'O') cnt++; | |
} | |
return cnt >= 2; | |
} | |
// ์ฌ๊ฐํ์ ๋ฒ์ ๊ตฌํ๊ธฐ. | |
public static void calcMinMaxCoordi(int x, int y) { | |
maxX = Math.max(maxX, x); | |
maxY = Math.max(maxY, y); | |
minX = Math.min(minX, x); | |
minY = Math.min(minY, y); | |
} | |
// ๋ฎ, ๋ฐค์ ๋ฐ๋ผ BFS ํ์ | |
public static int dayOrNighttimeBFS(boolean dayOrNight) { | |
int cnt = 1; | |
int[] dx = {0, 0, -1, 1}; | |
int[] dy = {-1, 1, 0, 0}; | |
while (!qu.isEmpty()) { | |
node nd = qu.poll(); | |
if (dayOrNight) { // ๋ฎ | |
// ์ ์์ฒด์จ์ผ๋ก ๋ณ๊ฒฝ ๊ฐ๋ฅํ์ง ํ๋จ. | |
if (arr1[nd.y][nd.x] == 'O') continue; | |
if (!isCanChange(nd.x, nd.y)) continue; | |
answer++; | |
arr1[nd.y][nd.x] = 'O'; | |
} | |
for (int i = 0; i < 4; i++) { | |
int nx = nd.x + dx[i]; | |
int ny = nd.y + dy[i]; | |
if (nx < 0 || ny < 0 || nx >= M || ny >= N) continue; | |
if (dayOrNight) { // ๋ฎ | |
if (arr1[ny][nx] == '.') { | |
// ๋ฐฉ๊ธ ์ฒด์จ์ด ํ๋ณต๋ ์ฌ๋ ์ฃผ๋ณ์ ํ์๊ฐ ์๋ค๋ฉด ํ์ ๋ฃ๊ธฐ | |
// ๋ฎ ์ฌ์ด ํ๋ณต์ด ์ถฉ๋ฐํ ๋ง์ด ๋ฐ๋ณต๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ์. | |
qu.offer(new node(nx, ny)); | |
} | |
} else { // ๋ฐค | |
if (!vi[ny][nx] && arr1[ny][nx] == 'O') { | |
// ์ ์์ฒด์จ ์ฌ๊ฐํ ์งํฉ ์ขํ ๋ฒ์ ๊ตฌํ๊ธฐ, ์ธ์ ์นด์ดํธ ํ๊ธฐ. | |
vi[ny][nx] = true; | |
calcMinMaxCoordi(nx, ny); | |
cnt++; | |
qu.offer(new node(nx, ny)); | |
} | |
} | |
} | |
} | |
return cnt; | |
} | |
public static void main(String[] args) throws IOException { | |
BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); | |
StringBuilder sb = new StringBuilder(); | |
StringTokenizer st; | |
st = new StringTokenizer(br.readLine(), " "); | |
N = Integer.parseInt(st.nextToken()); | |
M = Integer.parseInt(st.nextToken()); | |
K = Integer.parseInt(st.nextToken()); | |
arr1 = new char[N][M]; | |
vi = new boolean[N][M]; | |
for (int i = 0; i < N; i++) { | |
String str = br.readLine(); | |
for (int j = 0; j < M; j++) { | |
arr1[i][j] = str.charAt(j); | |
if (arr1[i][j] == '.') { | |
qu.offer(new node(j, i)); | |
} else { | |
// ์ด๊ธฐ ์ ์ ์ธ์ ์นด์ดํธ | |
answer++; | |
} | |
} | |
} | |
// true -> ๋ฎ์ผ๋, false -> ๋ฐค์ผ๋ | |
dayOrNighttimeBFS(true); | |
for (int i = 0; i < N; i++) { | |
for (int j = 0; j < M; j++) { | |
// ๋ฐค์ผ๋, ์ ์์ฒด์จ ์งํฉ ์ฌ๊ฐํ ๋ฒ์ ํ์ | |
if (!vi[i][j] && arr1[i][j] == 'O') { | |
minX = minY = 20001; | |
maxX = maxY = 0; | |
vi[i][j] = true; | |
qu.offer(new node(j, i)); | |
calcMinMaxCoordi(j, i); // ์ฌ๊ฐํ ์ขํ ๋ฒ์ ๊ตฌํ๊ธฐ. | |
int cnt = dayOrNighttimeBFS(false); | |
int tmpX = maxX - minX + 1; | |
int tmpY = maxY - minY + 1; | |
// ์ฌ๊ฐํ์ ๋ณ ๋ณด๋ค K๊ฐ ๊ฐ๊ฑฐ๋ ํฌ๋ค๋ฉด | |
if (K >= tmpX || K >= tmpY) { | |
// ์๊ตฌ์ ์ผ๋ก ์ฌ๊ฐํ ๋ฒ์๋ฅผ ์ค์ผ ์ ์์ -> ์๊ตฌ์ ํ์ ๋ฐ์ | |
answer -= cnt; | |
} | |
} | |
} | |
} | |
System.out.println(answer); | |
} | |
} |
์ฃผ์์ผ๋ก ๊ฐ ํจ์๋ง๋ค ์ค๋ช ์ ์ ์ด๋จ์ผ๋ ํฌ๊ฒ ์ดํดํ๋๋ฐ ์ด๋ ค์์ ์์ ๊ฒ ๊ฐ๋ค.
๋จ dayOrNighttimeBFS() ํจ์๋ ํ๋ผ๋ฏธํฐ๋ฅผ ์ฐธ, ๊ฑฐ์ง์ผ๋ก ๋ฐ๋๋ค.
์ฐธ -> ๋ฎ ๊ฒฝ์ฐ, ๊ฑฐ์ง -> ๋ฐค ๊ฒฝ์ฐ๋ก ๋๋ ์ ๊ฐ๊ฐ ๋ค๋ฅธ ์ญํ ์ ์ํํ๋ค.
BFS ํจ์๋ฅผ ๋ ๊ฐ๋ฅผ ๋ง๋ค๊น ํ์ง๋ง ์ค๋ณต์ฝ๋ ์ ๊ฑฐ๋ฅผ ์ํด ํ๋ผ๋ฏธํฐ์ ๋ฐ๋ผ ์ญํ ์ ๋๋ด๋ค.
๐ฑ ๋๋ ์

์ ๋ฌธ์ ๊ฐ ๋ฐฑ์ค์ ์ถ์ ๋ ์ง ๋ณ๋ก ์๋์๊ธฐ ๋๋ฌธ์ ํผ์ฌ๋ ์์ฒด๊ฐ ์ ์ด์ ์ด๋ฐ ๊ฒ ๊ฐ๋ค ใ ใ ;;
์ค์ ๋ก๋ ์๋ก์ด ๋ฌธ์ ์ ํ์ด์ด์ ์ฌ๋ฏธ์๊ฒ ํ์๋ค, ํ ๋ฒ์ฏค ํ์ด๋ณด๋ ๊ฑฐ ์ถ์ฒํ๋ค!
์ด๋ฐ ๊ฒฝํ์ด ๋ ์ฒ์์ด๋ผ ๋ฟ๋ฏํ๋ค, ๋ด ํ์ด๊ฐ ์ต์ ์ธ์ง๋ ๋ชจ๋ฅด๊ฒ ์ผ๋ java๋ก ํผ์ฌ๋์ด
์๊ธด๋ค๋ฉด ์ฒดํฌ๋ฅผ ํด๋ด์ผ๊ฒ ๋ค,
'Algorithm > - Baekjoon' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[BOJ] ๋ฐฑ์ค 13334 ์ฒ ๋ก (JAVA) (0) | 2024.05.09 |
---|---|
[BOJ] ๋ฐฑ์ค 1377 ๋ฒ๋ธ ์ํธ (JAVA) (1) | 2024.05.03 |
[BOJ] ๋ฐฑ์ค 4195 ์น๊ตฌ ๋คํธ์ํฌ (JAVA) (1) | 2024.04.15 |
[BOJ] ๋ฐฑ์ค 27211 ๋๋ ํ์ฑ (JAVA) (0) | 2024.04.10 |
[BOJ] ๋ฐฑ์ค 17299 ์ค๋ฑํฐ์ (JAVA) (0) | 2024.04.01 |
๋๋ง์ ๊ฐ๋ฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค!
ํฌ์คํ ์ด ์ข์๋ค๋ฉด "์ข์์โค๏ธ" ๋๋ "๊ตฌ๋ ๐๐ป" ํด์ฃผ์ธ์!