๋น์ฐ(๋ฌธ์ _ 2573)
์ง๊ตฌ ์จ๋ํ๋ก ์ธํ์ฌ ๋ถ๊ทน์ ๋น์ฐ์ด ๋ น๊ณ ์๋ค. ๋น์ฐ์ ๊ทธ๋ฆผ 1๊ณผ ๊ฐ์ด 2์ฐจ์ ๋ฐฐ์ด์ ํ์ํ๋ค๊ณ ํ์. ๋น์ฐ์ ๊ฐ ๋ถ๋ถ๋ณ ๋์ด ์ ๋ณด๋ ๋ฐฐ์ด์ ๊ฐ ์นธ์ ์์ ์ ์๋ก ์ ์ฅ๋๋ค.
๋น์ฐ ์ด์ธ์ ๋ฐ๋ค์ ํด๋น๋๋ ์นธ์๋ 0์ด ์ ์ฅ๋๋ค. ๊ทธ๋ฆผ 1์์ ๋น์นธ์ ๋ชจ๋ 0์ผ๋ก ์ฑ์์ ธ ์๋ค๊ณ ์๊ฐํ๋ค.
๊ทธ๋ฆผ 1. ํ์ ๊ฐ์๊ฐ 5์ด๊ณ ์ด์ ๊ฐ์๊ฐ 7์ธ 2์ฐจ์ ๋ฐฐ์ด์ ์ ์ฅ๋ ๋น์ฐ์ ๋์ด ์ ๋ณด
๋น์ฐ์ ๋์ด๋ ๋ฐ๋ท๋ฌผ์ ๋ง์ด ์ ํด์๋ ๋ถ๋ถ์์ ๋ ๋นจ๋ฆฌ ์ค์ด๋ค๊ธฐ ๋๋ฌธ์, ๋ฐฐ์ด์์ ๋น์ฐ์ ๊ฐ ๋ถ๋ถ์ ํด๋น๋๋ ์นธ์ ์๋ ๋์ด๋ ์ผ๋ ๋ง๋ค ๊ทธ ์นธ์ ๋์๋จ๋ถ ๋ค ๋ฐฉํฅ์ผ๋ก ๋ถ์ด์๋ 0์ด ์ ์ฅ๋ ์นธ์ ๊ฐ์๋งํผ ์ค์ด๋ ๋ค.
๋จ, ๊ฐ ์นธ์ ์ ์ฅ๋ ๋์ด๋ 0๋ณด๋ค ๋ ์ค์ด๋ค์ง ์๋๋ค. ๋ฐ๋ท๋ฌผ์ ํธ์์ฒ๋ผ ๋น์ฐ์ ๋๋ฌ์ธ์ฌ ์์ ์๋ ์๋ค.
ํ ๋ฉ์ด๋ฆฌ์ ๋น์ฐ์ด ์ฃผ์ด์ง ๋, ์ด ๋น์ฐ์ด ๋ ๋ฉ์ด๋ฆฌ ์ด์์ผ๋ก ๋ถ๋ฆฌ๋๋ ์ต์ด์ ์๊ฐ(๋ )์ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
๊ทธ๋ฆผ 1์ ๋น์ฐ์ ๋ํด์๋ 2๊ฐ ๋ต์ด๋ค. ๋ง์ผ ์ ๋ถ ๋ค ๋ น์ ๋๊น์ง ๋ ๋ฉ์ด๋ฆฌ ์ด์์ผ๋ก ๋ถ๋ฆฌ๋์ง ์์ผ๋ฉด ํ๋ก๊ทธ๋จ์ 0์ ์ถ๋ ฅํ๋ค.
์ ๋ ฅ๊ณผ ์ถ๋ ฅ
์
๋ ฅ
์ฒซ ์ค์๋ ์ด์ฐจ์ ๋ฐฐ์ด์ ํ์ ๊ฐ์์ ์ด์ ๊ฐ์๋ฅผ ๋ํ๋ด๋ ๋ ์ ์ N๊ณผ M์ด ํ ๊ฐ์ ๋น์นธ์ ์ฌ์ด์ ๋๊ณ ์ฃผ์ด์ง๋ค. N๊ณผ M์ 3 ์ด์ 300 ์ดํ์ด๋ค. ๊ทธ ๋ค์ N๊ฐ์ ์ค์๋ ๊ฐ ์ค๋ง๋ค ๋ฐฐ์ด์ ๊ฐ ํ์ ๋ํ๋ด๋ M๊ฐ์ ์ ์๊ฐ ํ ๊ฐ์ ๋น ์นธ์ ์ฌ์ด์ ๋๊ณ ์ฃผ์ด์ง๋ค.
๊ฐ ์นธ์ ๋ค์ด๊ฐ๋ ๊ฐ์ 0 ์ด์ 10 ์ดํ์ด๋ค. ๋ฐฐ์ด์์ ๋น์ฐ์ด ์ฐจ์งํ๋ ์นธ์ ๊ฐ์, ์ฆ, 1 ์ด์์ ์ ์๊ฐ ๋ค์ด๊ฐ๋ ์นธ์ ๊ฐ์๋ 10,000 ๊ฐ ์ดํ์ด๋ค. ๋ฐฐ์ด์ ์ฒซ ๋ฒ์งธ ํ๊ณผ ์ด, ๋ง์ง๋ง ํ๊ณผ ์ด์๋ ํญ์ 0์ผ๋ก ์ฑ์์ง๋ค.
์ถ๋ ฅ
์ฒซ ์ค์ ๋น์ฐ์ด ๋ถ๋ฆฌ๋๋ ์ต์ด์ ์๊ฐ(๋
)์ ์ถ๋ ฅํ๋ค. ๋ง์ผ ๋น์ฐ์ด ๋ค ๋
น์ ๋๊น์ง ๋ถ๋ฆฌ๋์ง ์์ผ๋ฉด 0์ ์ถ๋ ฅํ๋ค.
์์
5 7
0 0 0 0 0 0 0
0 2 4 5 3 0 0
0 3 0 2 5 2 0
0 7 6 2 4 0 0
0 0 0 0 0 0 0
answer : 2
ํ์ด
1. ํ๋ฒ์ ๋ชจ๋ ๋นํ์ ๋์ด๋ฅผ ๋ฐ๊ฟ์ฃผ๋ ๋ฐฉ๋ฒ
queue <pair<int, int>> q; // bfs์ ์ฌ์ฉํ ํ
queue <pair<pair<int, int>, int>> storeQ; // ๋ฐ๋๋ ๋นํ์ ๋์ด๋ฅผ ์ ์ฅํ ํ
1๋ ์ด ์ง๋ ๋๋ง๋ค ํ๋ฒ์ ๋ชจ๋ ๋นํ์ ๋์ด๊ฐ ๋ฐ๋์ด์ผ ํ๊ธฐ ๋๋ฌธ์ bfs๋ฅผ ์งํํ๋ฉฐ ๋ชจ๋ ๋นํ์ ์๋ก์ด ๋์ด๋ฅผ ์ ์ฅํด์ฃผ๊ณ bfs๊ฐ ๋๋ ๋๋ง๋ค arr(๋นํ ๋์ด ์ ์ฅ ๋ฐฐ์ด)์ ์๋กญ๊ฒ ์ ๋ฐ์ดํธ ํ๋ค.
2. ๋น์ฐ์ด ๋๋ ์ก๋์ง ํ๋จํ๋ ๋ฐฉ๋ฒ
๋น์ฐ์ด 1๊ฐ์ ๋ฉ์ด๋ฆฌ๋ผ๋ฉด ์ฒซ๋ฒ์งธ ๋นํ๋ก bfs๋ฅผ ํ์ ๋ ๋น์ฐ์์ ์๋ ๋ชจ๋ ๋นํ๋ฅผ ๋ฐฉ๋ฌธํ๋ค. ๋ง์ฝ bfs๋ฅผ ๋ ์์ํ๊ฒ ๋๋ค๋ฉด ๋น์ฐ์ด 2๊ฐ ์ด์์ด๋ผ๋ ๋ป์ด๋ค.
3. ๋ง์ผ ๋น์ฐ์ด ๋ค ๋
น์ ๋๊น์ง ๋ถ๋ฆฌ๋์ง ์์๋์ง ํ๋จํ๋ ๋ฐฉ๋ฒ
์ ์ฒด ํ์ํ์ ๋ ๋นํ๊ฐ ํ๋๋ ์๋ค๋ฉด ๋น์ฐ์ด ๋ค ๋
น์๋ค๋ ๋ป์ด๋ค. ์ด๋ ๋น์ฐ์ด ๋ถ๋ฆฌ๋์๋์ง ๋จผ์ ํ๋จํ๊ณ ๋นํ๊ฐ ์๋์ง ํ๋จํด์ผ ํ๋ค.
4. ๋ง์ง๋ง์ year - 1 ์ ํ๋ ์ด์
๋ด ์ฝ๋์์๋ ๋น์ฐ์ด ๋ถ๋ฆฌ๋์๋์ง ํ๋จํ๋ ๊ณผ์ ์ด ๋ค์๊ณผ ๊ฐ๋ค.
- ๋นํ๋ฅผ ๋ง๋๋ฉด bfs๋ฅผ ์์ํ๋ค.
- bfs๊ฐ ๋๋๋ฉด ์ผ์์ด ๋ น์๊ฑธ arr์ ๋ฐ์ํ๋ค. -> ์ด๋ ๋น์ฐ์ด ๋ถ๋ฆฌ๋ ์ ์๋ค. -> 1๋ ์ด ์ง๋ฌ๋ค๊ณ ์๊ฐํ๋ค.
- bfs๋ฅผ ์์ํ ๋น์ ๋น์ฐ์ด ํ๋์๋ค๊ณ ๊ฐ์ ํ๋ค๋ฉด ๋นํ๋ ๋ชจ๋ visit ์ํ๊ฐ ๋์ด์ ์ด์คํฌ๋ฌธ์ ๋ชจ๋ ํต๊ณผํ๋ค.
- ๋ค์ while๋ฌธ ์ฒ์์ผ๋ก ๊ฐ์ bfsStart, notFound,visited๋ฅผ ์ด๊ธฐํ ํ๋ค.
- ์ด๋ฏธ ๋น์ฐ์ด 2๋ฒ์์ ๋ถ๋ฆฌ๋์์ง๋ง ๋ถ๋ฆฌ ๋์์์ ํ๋จํ์ง ๋ชปํ์ผ๋ฏ๋ก ๋ค์ bfs๋ฅผ ์์ํ๋ค -> ๋น์ฐ์ด ๋๊ฐ๋ผ๋ฉด ์ฒ์ ๋์ค๋ ๋น์ฐ์ ํฌํจ๋๋ ๋นํ์ ๋์ด๊ฐ ๋ฐ๋๋ค -> 1๋ ์ด ์ง๋ฌ๋ค๊ณ ์๊ฐํ๋ค
- ์ฒซ๋ฒ์งธ๋ก ๋์ค๋ ๋น์ฐ์ visit ์ํ์ด์ง๋ง, ๋๋ฒ์งธ๋ก ๋์ค๋ ๋น์ฐ์ visit ์ํ๊ฐ ์๋๋ฏ๋ก ์ด์คํฌ๋ฌธ์์ ๋ค์ ํ๋ฒ bfs๋ฅผ ์์ํ๊ฒ ๋๋ค.
์ฆ 2๋ฒ์์ ์ด๋ฏธ ๋น์ฐ์ ๋ถ๋ฆฌ ๋์์ง๋ง ํ๋จ์ 5๋ฒ์์ ํ๋ฏ๋ก ์ผ๋ ์ด ๋ ์ถ๊ฐ๋๊ฒ ๋๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ๊ฒฐ๊ณผ๊ฐ์ ์ถ๋ ฅํ ๋ year -1๋ก ํ๋ค.
์ฝ๋
bool visited[301][301] = { false, };
int arr[301][301];
int dx[4] = { 0, 1, 0, -1 };
int dy[4] = { 1,0,-1,0 };
queue <pair<pair<int, int>, int>> storeQ;
// ๋ฐ๋๋ ๋น์ฐ ๋์ด ์ ์ฅ (x,y,์๋ก์ด๋์ด)
int main() {
int n, m;
cin >> n >> m;
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
cin >> arr[i][j];
}
}
bool chk = false; // ๋น์ฐ ๋ถ๋ฆฌ ๋๋์ง ํ์ธํ๋ ๋ณ์
int year = 0; // ์์ ์๊ฐ
while (!chk) { // ๋น์ฐ์ด ๋ถ๋ฆฌ๋ ๋๊น์ง
bool bfsStart = false;
bool notFound = true;
// 1๋
์ด ์ง๋ ๋๋ง๋ค visited ์ด๊ธฐํ
for (int vi = 0; vi < n; vi++) {
for (int vj = 0; vj < m; vj++) {
visited[vi][vj] = false;
}
}
for (int i = 1; i < n-1; i++) { // ๋งจ์ฒ์๊ณผ, ๋ง์ง๋ง ์ ์ธ
if (chk) break; // ๋น์ฐ ๋ถ๋ฆฌ ๋์์ผ๋ฉด stop
for (int j = 1; j < m-1; j++) {
if (arr[i][j] > 0 && !visited[i][j]) {
notFound = false; // ๋น์ฐ์ด ๋ฐ๊ฒฌ๋จ(true - ๋ฐ๊ฒฌ์๋จ)
if(bfsStart == false){ // ์์ง ํ๋ฒ๋ bfs๋ฅผ ์์ํ์ง ์์๋ค๋ฉด
queue<pair<int, int>> q;
visited[i][j] = true;
q.push({ i,j });
bfsStart = true; // bfs ์์
while (!q.empty()) {
pair<int, int> cur = q.front();
q.pop();
int seaCnt = 0;
for (int dir = 0; dir < 4; dir++) {
int nx = cur.first + dx[dir];
int ny = cur.second + dy[dir];
if (nx < 0 || nx >= n || ny < 0 || ny >= m) continue;
if (arr[nx][ny] == 0) { // ๋ฐ๋ค๋ผ๋ฉด
seaCnt++;
}
if (arr[nx][ny] > 0) { // ๋นํ๋ผ๋ฉด
if (!visited[nx][ny]) {
visited[nx][ny] = true;
q.push({ nx,ny });
}
}
}
int newH = arr[cur.first][cur.second] - seaCnt;
if (newH < 0) newH = 0;
storeQ.push({ {cur.first,cur.second},newH });
}
// bfs ๋๋๋ฉด ์ผ์ ๋
น์๊ฑฐ ๋ฐ์
while (!storeQ.empty()) {
int x = storeQ.front().first.first;
int y = storeQ.front().first.second;
int h = storeQ.front().second;
storeQ.pop();
arr[x][y] = h; // ์๋ก์ด ๋์ด ๋ฐ์
}
year++; // 1๋
์ง๋จ
}
else { // ์ด๋ฏธ ํ๋ฒ bfs๋ฅผ ํ๋ค๋ฉด - ์ฆ ์๋ก์ด ๋น์ฐ
chk = true; // ๋น์ฐ์ด ๋ถ๋ฆฌ๋จ
break;
}
}
}
}
if (notFound) { // ๋น์ฐ์ด ํ๋๋ ์๋ค๋ฉด
cout << 0;
return 0;
}
}
cout << year-1; // ๋ง์ง๋ง์ bfs๋ฅผ ํ๋ฒ ๋ ํ๊ธฐ ๋๋ฌธ์ -1
}