๊ตฌ๋ฆ„ํ†ค ์ฑŒ๋ฆฐ์ง€ 3์ฃผ ์ฐจ ํ•™์Šต ์ผ๊ธฐ - 2
ย - Last update: 2023-08-29

๊ตฌ๋ฆ„ํ†ค ์ฑŒ๋ฆฐ์ง€๋ž€?

๊ตฌ๋ฆ„ ์ด๋ผ๋Š” ๊ณณ์—์„œ ๋ฌธ์ œ ํ’€์ด ์ฑŒ๋ฆฐ์ง€(๊ตฌ๋ฆ„ํ†ค ์ฑŒ๋ฆฐ์ง€)๋ฅผ ํ•œ๋‹ค๊ณ  ํ•ด์„œ ์ฐธ์—ฌ ์ค‘์ด๋‹ค. ์ด๋ฒคํŠธ ๊ธฐ๊ฐ„ ๋™์•ˆ ๋ฌธ์ œ๊ฐ€ ๊พธ์ค€์ด ์˜ฌ๋ผ์˜ค๋ฉฐ, ์ฃผ์— 2ํšŒ์”ฉ (ํ˜น์€ ๊ทธ ์ด์ƒ) ์ฑŒ๋ฆฐ์ง€ ๋ฌธ์ œ๋“ค์— ๋Œ€ํ•ด ํ’€์ด๊ฐ€ ๊ฐ€๋Šฅํ•œ ๋ฌธ์ œ๋“ค์„ ํ’€์ดํ•ด๋ณด๊ณ , ํ›„๊ธฐ๋ฅผ ๋‚จ๊ฒจ๋ณด๋ ค๊ณ  ํ•œ๋‹ค.

๋ฌธ์ œ ํ’€์ด

ํ’€์ด ์ ‘๊ทผ

์ด ๋ฌธ์ œ์˜ ๊ฒฝ์šฐ ์กฐ๊ธˆ ๋…ผ๋ž€์ด ์žˆ์„ ์ˆ˜ ์žˆ๊ฒ ๋‹ค. ์™œ๋ƒํ•˜๋ฉด, ์•„๋ฌด๋ฆฌ ๋ด๋„ ๊ตฌ๋ฆ„ IDE์—์„œ ์Šคํƒ ๋ฉ”๋ชจ๋ฆฌ์— ๋Œ€ํ•œ ์ œ์•ฝ์กฐ๊ฑด์ด ๋ณด์ด์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๋งŒ์•ฝ ์ผ๋ฐ˜์ ์ธ ์œˆ๋„์šฐ ํ™˜๊ฒฝ์ด๋ผ๋ฉด ๋ณดํ†ต ์Šคํƒ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ 1MB ์ •๋„๋กœ ๋ณด๋Š”๋ฐ, ๊ทธ๋Ÿด ๊ฒฝ์šฐ์—๋Š” DFS๋กœ ๋งต ํƒ์ƒ‰์„ ๊ตฌํ˜„ํ•˜๋ฉด ์ „์ฒด ๋งต์˜ ํฌ๊ธฐ๊ฐ€ 1000ร—10001000 \times 1000 ์ด๋ฏ€๋กœ, stack overflow๊ฐ€ ๋‚  ์ˆ˜ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ ์ด๊ฒƒ์€ ํ™˜๊ฒฝ์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์งˆ ์ˆ˜ ์žˆ๋Š” ๊ฐ’์ด๋ฏ€๋กœ, DFS๋กœ ํ’€์—ˆ๋‹ค๊ณ  RTE๊ฐ€ ๋‚˜๋Š” ๊ฒƒ์€ ์กฐ๊ธˆ ๋„Œ์„ผ์Šค๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๊ฒ ๋‹ค. (์•„๋‹ˆ๋ฉด ๋ฌธ์ œ ์กฐ๊ฑด์— ์Šคํƒ ๋ฉ”๋ชจ๋ฆฌ ํฌ๊ธฐ๋ฅผ ๋ช…์‹œํ•˜๋ฉด ๋œ๋‹ค.)

์•„๋ฌดํŠผ ๋ฌธ์ œ ์ž์ฒด๋Š” ๊ฐ„๋‹จํžˆ BFS๋กœ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ„๋‹จํ•œ ๋งต ํƒ์ƒ‰ ๋ฌธ์ œ์ด๋‹ค. ๋งต์„ ํƒ์ƒ‰ํ•˜๋‹ค๊ฐ€ 11์„ ๋ฐœ๊ฒฌํ•˜๋ฉด ํ•ด๋‹น ์ขŒํ‘œ ๊ธฐ์ ์œผ๋กœ ์—ฐ๊ฒฐ๋˜๋Š” ๊ฒƒ๋“ค์„ 0์œผ๋กœ ๋งŒ๋“ค๊ณ  ๊ณ„์† ํƒ์ƒ‰ํ•˜๊ณ ๋ฅผ ๋ฐ˜๋ณตํ•ด์ฃผ๋ฉด ๋œ๋‹ค. ๊ฐ„๋‹จํ•œ ๋ฌธ์ œ์ธ๋ฐ ์œ„ ์ด์Šˆ๋กœ ์‚ฝ์งˆ์„ ์ข€ ํ–ˆ๋‹ค.

#include <stdio.h>
int M[1010][1010];
int dy[4] = {0, 1, 0, -1};
int dx[4] = {1, 0, -1, 0};
struct P {
int y, x;
};
P q[2000000];
int qf, qr;
void clear(int y, int x) {
qf = qr = 0;
q[qr++] = {y, x};
while(qf != qr) {
auto& cur = q[qf++];
if (M[cur.y][cur.x] == 0) continue;
M[cur.y][cur.x] = 0;
for(int i = 0; i < 4; ++i) {
if (M[cur.y + dy[i]][cur.x + dx[i]] == 1)
q[qr++] = {cur.y + dy[i], cur.x + dx[i]};
}
}
}
int main() {
int N; scanf("%d", &N);
for(int i = 1; i <= N; ++i) {
for(int j = 1; j <= N; ++j) {
scanf("%d", &M[i][j]);
}
}
int ans = 0;
for(int i = 1; i <= N; ++i) {
for(int j = 1; j <= N; ++j) {
if (M[i][j]) {
clear(i, j);
++ans;
}
}
}
printf("%d\n", ans);
return 0;
}
๐Ÿท๏ธ ์ฃผ์ œ ๋ชฉ๋ก: