2024. 3. 22. 15:21ใCoding Test/BOJ
๐๋ฌธ์ ๋ณด๋ฌ๊ฐ๊ธฐ
๐จ๐ปํ์ด ๊ณผ์
๊ตฌํ ๋ฌธ์ ๋ ์๊ตฌ ์ฌํญ์ด ๋ง๊ธฐ ๋๋ฌธ์, ๊ตฌํํด์ผ ํ ๊ธฐ๋ฅ๋ณ๋ก ํจ์ํํ์ฌ ์ ๊ทผํ๋ ๊ฒ ๊ฐ์ฅ ์ข์ ๊ฒ ๊ฐ์ต๋๋ค. ์ด ๋ฌธ์ ์์ ๊ตฌํํด์ผ ํ ์๊ตฌ์ฌํญ๋ค์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
1. ๋ฌธ์ ์์ ์ฃผ์ด์ง ์ ๋ ฅ์ ๋ฐ๋ ํจ์
๋ฌธ์ ์์ ๊ฐ๋ก ํ์ ๊ฐ์์ ์ธ๋ก ํ์ ๊ฐ์, ๊ทธ๋ฆฌ๊ณ ํ์ ์ํ๋ฅผ ์ ๋ ฅ์ผ๋ก ์ค๋๋ค. ์ด๋ฌํ ๋ด์ฉ๋ค์ ๋ฐฐ์ด์ ์ ๋ ฅ๋ฐ๋, ์น์ฆ์ ๊ฐ์ ๋ํ ์ธ์ ๋ณ๋์ ๋ณ์์ ์ ์ฅํด์ฃผ์์ต๋๋ค. ์ด ์น์ฆ์ ๊ฐ์๊ฐ ๋ฃจํ ์ข ๋ฃ ์กฐ๊ฑด์ด๊ธฐ ๋๋ฌธ์ด์ฃ .
2. ๊ณต๊ธฐ๋ฅผ ์ฃผ๋ณ์ผ๋ก ํ์ฐ์ํค๋ ํจ์
ํด๋น ๋ฌธ์ ์ ์ด๊ธฐ ๋น ์ ์ฌ๊ฐํ์ ์น์ฆ์ ๋ฐ๊นฅ์ ์๋ค๋ฉด ๊ณต๊ธฐ๋ฅผ, ์น์ฆ์ ๋ด๋ถ์ ์๋ค๋ฉด ์ง๊ณต ์ํ๋ฅผ ์๋ฏธํฉ๋๋ค. ๋ํ, ๊ณต๊ธฐ์ ์ ์ดํ ์น์ฆ๊ฐ ๋ น์ ๋ด๋ถ ์ง๊ณต ๊ณต๊ฐ์ด ์ธ๋ถ๋ก ๋ ธ์ถ๋๋ฉด, ๊ณต๊ธฐ๊ฐ ์์ ํ๋ฌ๋ค์ด๊ฐ์ผ ํ๋ฏ๋ก ์ด๋ฌํ ์ญํ ์ ํ๋ ํจ์๊ฐ ํ์ํ๊ฒ ์ต๋๋ค.
3. ๊ณต๊ธฐ์ ๋ ธ์ถ๋ ์น์ฆ๋ฅผ ์ฐพ๋ ํจ์
์ด ๋ฌธ์ ์์ ๊ตฌํํด์ผ ํ ํต์ฌ ๊ธฐ๋ฅ์ ๋๋ค. 2์ค for ๋ฌธ์ผ๋ก ์ ์ฒด ๋งต์ ์ํํ๋ค๊ฐ ์น์ฆ๋ฅผ ๋ฐ๊ฒฌํ๋ฉด, ํด๋น ์น์ฆ์ ์ํ์ข์ฐ ์ธ์ ์นธ์ ์กฐ์ฌํ์ฌ ๊ณต๊ธฐ๊ฐ ์๋์ง๋ฅผ ๊ฒ์ฌํฉ๋๋ค. ๋ง์ฝ ๊ณต๊ธฐ๊ฐ ์๋ค๋ฉด, ํด๋น ์น์ฆ๋ ํ ์๊ฐ ๋ค์ ๋ น์๋ด๋ฆด ์น์ฆ์ด๋ฏ๋ก ์ ๊ฑฐ ๋์ ๋ฆฌ์คํธ์ ์ฌ๋ ค์ฃผ๋ฉด ๋ฉ๋๋ค.
4. ๊ณต๊ธฐ์ ๋ ธ์ถ๋ ์น์ฆ๋ฅผ ์ ๊ฑฐํ๋ ํจ์
3๋ฒ ํจ์์์ ์ฐพ์ ์น์ฆ๋ค์ ์ ๊ฑฐํด์ฃผ๋ฉด ๋์ง๋ง, ์ค์ํ ์ ์ ์ ๊ฑฐํ ์น์ฆ๊ฐ ๋ด๋ถ ์ง๊ณต ๊ณต๊ฐ์ ๋ฒฝ ์ญํ ์ ํ๋ ์น์ฆ์ผ ์๋ ์๋ค๋ ๋ถ๋ถ์ ๋๋ค. ์ด ๋์๋ ๊ณต๊ธฐ๊ฐ ๋ด๋ถ ์ง๊ณต ๊ณต๊ฐ์ผ๋ก ์ ์ ๋์ด์ผ ํ๋ฏ๋ก, ์น์ฆ๋ฅผ ์ ๊ฑฐํ ํ 2๋ฒ ํจ์๋ฅผ ํตํด ๊ณต๊ธฐ ํ์ฐ์ ์์ผ์ค๋๋ค.
์ด๋ฌํ ํจ์๋ค์ ์กฐํฉํ์ฌ ์น์ฆ๊ฐ ๋ค ์ ๊ฑฐ๋ ๋๊น์ง 3, 4๋ฒ ํจ์๋ฅผ ๋๋ฆฌ๋ฉด ๋ฉ๋๋ค. ๊ทธ ๊ณผ์ ์์ ๋ฃจํ๋ฅผ ํ ๋ฒ ๋ ๋๋ง๋ค ์๊ฐ์ +1 ํด์ฃผ๊ณ , ์ ๊ฑฐํ๊ธฐ ์ ์ ์น์ฆ ๊ฐ์ ๋ํ ๋ณ๋๋ก ์ ์ฅํด์ฃผ๋ฉด ๋๊ฒ ์ต๋๋ค.
โ๏ธ์์ค ์ฝ๋ ๋ฐ ๊ฒฐ๊ณผ
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
using Point = pair<int, int>;
#define FAST_IO ios::sync_with_stdio(false); cout.tie(NULL); cin.tie(NULL);
#define AIR -1
#define VACUUM 0
#define CHEESE 1
#define AIR_EXPOSED_CHEESE 2
int MaxRow, MaxColumn, NumOfCheeses;
vector<vector<int>> Field;
vector<Point> Directions { {-1, 0}, {1, 0}, {0, -1}, {0, 1} };
queue<Point> AirExposedCheeses;
void Initialize()
{
cin >> MaxRow >> MaxColumn;
Field.resize(MaxRow, vector<int>(MaxColumn));
for (int r = 0; r < MaxRow; r++)
{
for (int c = 0; c < MaxColumn; c++)
{
cin >> Field[r][c];
if (Field[r][c] == CHEESE) NumOfCheeses++;
}
}
}
void SetExternalAir(int row, int column)
{
queue<Point> externalAirs;
Field[row][column] = AIR;
externalAirs.push(Point(row, column));
while (!externalAirs.empty())
{
row = externalAirs.front().first;
column = externalAirs.front().second;
externalAirs.pop();
for (const Point& direction : Directions)
{
int nextRow = row + direction.first;
int nextColumn = column + direction.second;
if (nextRow < 0 or nextRow >= MaxRow or nextColumn < 0 or nextColumn >= MaxColumn)
continue;
if (Field[nextRow][nextColumn] == CHEESE or Field[nextRow][nextColumn] == AIR)
continue;
Field[nextRow][nextColumn] = AIR;
externalAirs.push(Point(nextRow, nextColumn));
}
}
}
bool IsAirExposedCheese(int row, int column)
{
for (const Point& direction : Directions)
{
int nextRow = row + direction.first;
int nextColumn = column + direction.second;
if (Field[nextRow][nextColumn] == AIR)
return true;
}
return false;
}
void FindAirExposedCheeses()
{
for (int r = 0; r < MaxRow; r++)
{
for (int c = 0; c < MaxColumn; c++)
{
if (Field[r][c] == AIR or Field[r][c] == VACUUM or Field[r][c] == AIR_EXPOSED_CHEESE)
continue;
if (IsAirExposedCheese(r, c))
{
Field[r][c] = AIR_EXPOSED_CHEESE;
AirExposedCheeses.push(Point(r, c));
}
}
}
}
int RemoveAirExposedCheeses()
{
int count = AirExposedCheeses.size();
for (int i = 0; i < count; i++)
{
Point position = AirExposedCheeses.front();
AirExposedCheeses.pop();
SetExternalAir(position.first, position.second);
}
return count;
}
int main()
{
FAST_IO
Initialize();
SetExternalAir(0, 0);
int numOfCheesesAnHourAgo = NumOfCheeses;
int currentNumOfCheeses = NumOfCheeses;
int hour = 0;
while (currentNumOfCheeses > 0)
{
FindAirExposedCheeses();
numOfCheesesAnHourAgo = currentNumOfCheeses;
currentNumOfCheeses -= RemoveAirExposedCheeses();
hour++;
}
cout << hour << "\n" << numOfCheesesAnHourAgo;
return 0;
}
'Coding Test > BOJ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[BOJ] 12904๋ฒ | A์ B (C++) (0) | 2024.03.28 |
---|---|
[BOJ] 14891๋ฒ | ํฑ๋๋ฐํด (C++) (0) | 2024.03.24 |
[BOJ] 14499๋ฒ | ์ฃผ์ฌ์ ๊ตด๋ฆฌ๊ธฐ (C++) (1) | 2024.03.17 |
[BOJ] 14725๋ฒ | ๊ฐ๋ฏธ๊ตด (C++) (1) | 2024.02.15 |
[BOJ] 1644๋ฒ | ์์์ ์ฐ์ํฉ (C++) (1) | 2024.02.07 |