๋์
2020๋ ์๋ฐ๊ธฐ ์ผ์ฑ์ ์ ๊ธฐ์ถ๋ฌธ์ ์ธ ๋ฐฑ์ค(#16236) ์๊ธฐ์์ด ๋ฌธ์ ๋ฅผ ํ์ด๋ด ์๋ค!
ํ์ ๋ฐ ์๋ฎฌ๋ ์ด์ ๋ฌธ์ ์ ๋๋ค. ์ฒ์ ๋ณด๊ธฐ์ ๋ฌธ์ ๊ฐ ๊ธธ๊ณ ๋ณต์กํด์ ์ด๋ ค์ ๋ณด์ผ ์ ์์ต๋๋ค. ํ์ง๋ง ๋จผ์ ๋ฌธ์ ๋ฅผ ์ ์ดํดํ๋์ง ๊ผญ ํ์ธํด๋ณด๊ณ ์ฃผ์ด์ง ์กฐ๊ฑด์ ํ์ธํด๊ฐ๋ฉด์ ์ฝ๋ฉํ๋ค ๋ณด๋ฉด ์ด๋์ ์ ๋ต์ ์ฝ๋๋ฅผ ๋์ถํด๋ผ ์ ์์ ๊ฒ์ ๋๋ค. - solved.ac ๊ณจ๋ 5
๋ฌธ์
N×N ํฌ๊ธฐ์ ๊ณต๊ฐ์ ๋ฌผ๊ณ ๊ธฐ M๋ง๋ฆฌ์ ์๊ธฐ ์์ด 1๋ง๋ฆฌ๊ฐ ์๋ค. ๊ณต๊ฐ์ 1×1 ํฌ๊ธฐ์ ์ ์ฌ๊ฐํ ์นธ์ผ๋ก ๋๋์ด์ ธ ์๋ค. ํ ์นธ์๋ ๋ฌผ๊ณ ๊ธฐ๊ฐ ์ต๋ 1๋ง๋ฆฌ ์กด์ฌํ๋ค.
์๊ธฐ ์์ด์ ๋ฌผ๊ณ ๊ธฐ๋ ๋ชจ๋ ํฌ๊ธฐ๋ฅผ ๊ฐ์ง๊ณ ์๊ณ , ์ด ํฌ๊ธฐ๋ ์์ฐ์์ด๋ค. ๊ฐ์ฅ ์ฒ์์ ์๊ธฐ ์์ด์ ํฌ๊ธฐ๋ 2์ด๊ณ , ์๊ธฐ ์์ด๋ 1์ด์ ์ํ์ข์ฐ๋ก ์ธ์ ํ ํ ์นธ์ฉ ์ด๋ํ๋ค.
์๊ธฐ ์์ด๋ ์์ ์ ํฌ๊ธฐ๋ณด๋ค ํฐ ๋ฌผ๊ณ ๊ธฐ๊ฐ ์๋ ์นธ์ ์ง๋๊ฐ ์ ์๊ณ , ๋๋จธ์ง ์นธ์ ๋ชจ๋ ์ง๋๊ฐ ์ ์๋ค. ์๊ธฐ ์์ด๋ ์์ ์ ํฌ๊ธฐ๋ณด๋ค ์์ ๋ฌผ๊ณ ๊ธฐ๋ง ๋จน์ ์ ์๋ค. ๋ฐ๋ผ์, ํฌ๊ธฐ๊ฐ ๊ฐ์ ๋ฌผ๊ณ ๊ธฐ๋ ๋จน์ ์ ์์ง๋ง, ๊ทธ ๋ฌผ๊ณ ๊ธฐ๊ฐ ์๋ ์นธ์ ์ง๋๊ฐ ์ ์๋ค.
์๊ธฐ ์์ด๊ฐ ์ด๋๋ก ์ด๋ํ ์ง ๊ฒฐ์ ํ๋ ๋ฐฉ๋ฒ์ ์๋์ ๊ฐ๋ค.
- ๋ ์ด์ ๋จน์ ์ ์๋ ๋ฌผ๊ณ ๊ธฐ๊ฐ ๊ณต๊ฐ์ ์๋ค๋ฉด ์๊ธฐ ์์ด๋ ์๋ง ์์ด์๊ฒ ๋์์ ์์ฒญํ๋ค.
- ๋จน์ ์ ์๋ ๋ฌผ๊ณ ๊ธฐ๊ฐ 1๋ง๋ฆฌ๋ผ๋ฉด, ๊ทธ ๋ฌผ๊ณ ๊ธฐ๋ฅผ ๋จน์ผ๋ฌ ๊ฐ๋ค.
- ๋จน์ ์ ์๋ ๋ฌผ๊ณ ๊ธฐ๊ฐ 1๋ง๋ฆฌ๋ณด๋ค ๋ง๋ค๋ฉด, ๊ฑฐ๋ฆฌ๊ฐ ๊ฐ์ฅ ๊ฐ๊น์ด ๋ฌผ๊ณ ๊ธฐ๋ฅผ ๋จน์ผ๋ฌ ๊ฐ๋ค.
- ๊ฑฐ๋ฆฌ๋ ์๊ธฐ ์์ด๊ฐ ์๋ ์นธ์์ ๋ฌผ๊ณ ๊ธฐ๊ฐ ์๋ ์นธ์ผ๋ก ์ด๋ํ ๋, ์ง๋์ผ ํ๋ ์นธ์ ๊ฐ์์ ์ต์๊ฐ์ด๋ค.
- ๊ฑฐ๋ฆฌ๊ฐ ๊ฐ๊น์ด ๋ฌผ๊ณ ๊ธฐ๊ฐ ๋ง๋ค๋ฉด, ๊ฐ์ฅ ์์ ์๋ ๋ฌผ๊ณ ๊ธฐ, ๊ทธ๋ฌํ ๋ฌผ๊ณ ๊ธฐ๊ฐ ์ฌ๋ฌ ๋ง๋ฆฌ๋ผ๋ฉด, ๊ฐ์ฅ ์ผ์ชฝ์ ์๋ ๋ฌผ๊ณ ๊ธฐ๋ฅผ ๋จน๋๋ค.
์๊ธฐ ์์ด์ ์ด๋์ 1์ด ๊ฑธ๋ฆฌ๊ณ , ๋ฌผ๊ณ ๊ธฐ๋ฅผ ๋จน๋๋ฐ ๊ฑธ๋ฆฌ๋ ์๊ฐ์ ์๋ค๊ณ ๊ฐ์ ํ๋ค. ์ฆ, ์๊ธฐ ์์ด๊ฐ ๋จน์ ์ ์๋ ๋ฌผ๊ณ ๊ธฐ๊ฐ ์๋ ์นธ์ผ๋ก ์ด๋ํ๋ค๋ฉด, ์ด๋๊ณผ ๋์์ ๋ฌผ๊ณ ๊ธฐ๋ฅผ ๋จน๋๋ค. ๋ฌผ๊ณ ๊ธฐ๋ฅผ ๋จน์ผ๋ฉด, ๊ทธ ์นธ์ ๋น์นธ์ด ๋๋ค.
์๊ธฐ ์์ด๋ ์์ ์ ํฌ๊ธฐ์ ๊ฐ์ ์์ ๋ฌผ๊ณ ๊ธฐ๋ฅผ ๋จน์ ๋๋ง๋ค ํฌ๊ธฐ๊ฐ 1 ์ฆ๊ฐํ๋ค. ์๋ฅผ ๋ค์ด, ํฌ๊ธฐ๊ฐ 2์ธ ์๊ธฐ ์์ด๋ ๋ฌผ๊ณ ๊ธฐ๋ฅผ 2๋ง๋ฆฌ ๋จน์ผ๋ฉด ํฌ๊ธฐ๊ฐ 3์ด ๋๋ค.
๊ณต๊ฐ์ ์ํ๊ฐ ์ฃผ์ด์ก์ ๋, ์๊ธฐ ์์ด๊ฐ ๋ช ์ด ๋์ ์๋ง ์์ด์๊ฒ ๋์์ ์์ฒญํ์ง ์๊ณ ๋ฌผ๊ณ ๊ธฐ๋ฅผ ์ก์๋จน์ ์ ์๋์ง ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
Code
์ฐ์ ์ ์ฒด์ ์ธ ๋ ผ๋ฆฌ๋ฅผ ์ดํด๋ด ์๋ค.
int main(void) {
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int N;
cin >> N;
vii ocean(N, vi(N, 0));
Shark baby = placeFishTo(ocean, N);
int time = INF;
int total = 0;
while (time) {
vii mDist = calculate(ocean, N, baby);
time = solve(ocean, mDist, N, baby);
total += time;
}
cout << total << '\n';
return 0;
}
1. ์ ๋ ฅ
์ ๋ ฅ์ผ๋ก ์ฃผ์ด์ง๋ ๋ฌผ๊ณ ๊ธฐ๋ค์ ์์น๋ฅผ
Shark baby = placeFishTo(ocean, N);
๋ฅผ ํตํด ๋งต์ ์ ๋ ฅ๋ฐ์ต๋๋ค. ์ด๋ ์๊ธฐ์์ด์ ์์น์ ํฌ๊ธฐ๋ ๊ฐ์ฒด๋ก ๋ง๋ค์ด ๋งต(ocean)๊ณผ ๋ถ๋ฆฌํฉ๋๋ค.
Shark ๊ฐ์ฒด๋ ๋ค์๊ณผ ๊ฐ์ ๊ตฌ์กฐ์ฒด๋ก ์ ์๋์ด์์ต๋๋ค.
struct Shark {
int r; // ํ์ ์๋ฏธํฉ๋๋ค.
int c; // ์ด์ ์๋ฏธํฉ๋๋ค.
int size; // ์์ด์ ํฌ๊ธฐ ํน์ ์์ด์์ ๊ฑฐ๋ฆฌ๋ฅผ ๊ธฐ๋กํฉ๋๋ค.
Shark(int r, int c, int s) {
this->r = r;
this->c = c;
this->size = s;
}
};
์ ๋ ฅ ์์ค๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
Shark placeFishTo(vii &ocean, int N) {
Shark baby(0, 0, 2);
for (int r=0; r<N; r++) {
for (int c=0; c<N; c++) {
cin >> ocean[r][c];
if (ocean[r][c] == 9) {
baby.r = r;
baby.c = c;
ocean[r][c] = 0;
}
}
}
return baby;
}
์๊ธฐ์์ด์ ํฌ๊ธฐ๋ 2์ด๊ณ ์ ๋ ฅ ํ๋ ฌ์์ ์๊ธฐ์์ด์ ์์น๊ฐ 9๋ก ํ์๋๋ค๋ ์กฐ๊ฑด์ ํ์ฉํ์ฌ ์๊ธฐ์์ด ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ ๋งต์ ์์ฑ ํฉ๋๋ค.
2. BFS ํ์
vii mDist = calculate(ocean, N, baby);
๋ฅผ ํตํด ์๊ธฐ์์ด์ ํ์ฌ ์์น์์ ๋ฐฉ๋ฌธํ ์ ์๋ ์ขํ๊น์ง์ ์ต๋จ๊ฑฐ๋ฆฌ๋ฅผ BFS๋ฅผ ํ์ฉํ์ฌ ๊ณ์ฐํฉ๋๋ค.
vii calculate(vii &ocean, int N, Shark &baby) {
vii visited(N, vi(N, 0));
vii mdist(N, vi(N, -1));
qs q;
q.push(baby);
visited[baby.r][baby.c] = true;
mdist[baby.r][baby.c] = 0;
while (!q.empty()) {
Shark x = q.front(); q.pop();
vs dir = {
Shark(x.r-1, x.c, x.size), Shark(x.r, x.c-1, x.size),
Shark(x.r+1, x.c, x.size), Shark(x.r, x.c+1, x.size)
};
for (Shark each : dir) {
if (each.r<0 || each.c<0) continue;
if (each.r>=N || each.c>=N) continue;
if (visited[each.r][each.c]) continue;
if (ocean[each.r][each.c] > baby.size) {
visited[each.r][each.c] = true;
continue;
}
mdist[each.r][each.c] = mdist[x.r][x.c] + 1;
visited[each.r][each.c] = true;
q.push(each);
}
}
return mdist;
}
์ฐ์ ์๊ธฐ์์ด๊ฐ ๋งต์ ๋ชจ๋ ์นธ์ ๋ฐฉ๋ฌธํ ์ ์๋ค๊ณ ๊ฐ์ ํ๊ณ vii mdist(N, vi(N, -1));
๋ก ์ด๊ธฐํํฉ๋๋ค. ์๊ธฐ ์์ด์ ํ์ฌ ์์น์ ํฌ๊ธฐ๊ฐ ๊ธฐ๋ก๋์ด์๋ baby ๊ฐ์ฒด๋ฅผ ํ์ ๋ฃ์ต๋๋ค. ์๊ธฐ์์ด๊ฐ ์ํ์ข์ฐ๋ก ์ธ์ ํ ํ ์นธ์ฉ ์ด๋ํ ์ ์๋ค๋ ์กฐ๊ฑด์ ํ์ฉํ์ฌ ์ธ์ ํ ์ขํ๋ก ์ด๋ํ ๊ฒฝ์ฐ์ ์์ด ๊ฐ์ฒด๋ฅผ ๋ฒกํฐ์ ๋ฃ์ด๋ ํ ์ํํ๋ฉด์ ๋ค์๊ณผ ๊ฐ์ ์ฌํญ์ ํ์ธํฉ๋๋ค.
- ์ฃผ์ด์ง ์ขํ๊ฐ ๋งต์ ๋ฒ์ ์์ ์กด์ฌํ๋๊ฐ?
- ์ฃผ์ด์ง ์ขํ๊ฐ ์ด๋ฏธ ๋ฐฉ๋ฌธํ ๊ณณ์ธ๊ฐ?
- ์ฃผ์ด์ง ์ขํ์ ์กด์ฌํ๋ ์์ด๊ฐ ์๊ธฐ์์ด๋ณด๋ค ํฐ๊ฐ?
์๊ธฐ์์ด๊ฐ ๋งต ๋ฐ์ผ๋ก ๋๊ฐ๋ ๊ฒ์ ๋ถ๊ฐ๋ฅํ๋ฉฐ, ์๊ธฐ์์ด๊ฐ ๊ฐ๋ ค๊ณ ํ๋ ์ขํ๊ฐ ์ด๋ฏธ ๋ฐฉ๋ฌธํ ๊ณณ์ด์๋ค๋ฉด ์ต๋จ๊ฑฐ๋ฆฌ๊ฐ ์๋๋๋ค.
"์๊ธฐ ์์ด๋ ์์ ์ ํฌ๊ธฐ๋ณด๋ค ํฐ ๋ฌผ๊ณ ๊ธฐ๊ฐ ์๋ ์นธ์ ์ง๋๊ฐ ์ ์๊ณ , ๋๋จธ์ง ์นธ์ ๋ชจ๋ ์ง๋๊ฐ ์ ์๋ค. ์๊ธฐ ์์ด๋ ์์ ์ ํฌ๊ธฐ๋ณด๋ค ์์ ๋ฌผ๊ณ ๊ธฐ๋ง ๋จน์ ์ ์๋ค."
๋ฌธ์ ์์ ์ฃผ์ด์ง ์ ์กฐ๊ฑด์ ๋ฐ๋ผ์ ์ฃผ์ด์ง ์ขํ์ ์กด์ฌํ๋ ์์ด๊ฐ ์๊ธฐ ์์ด๋ณด๋ค ํฌ๋ฉด ์ง๋๊ฐ ์ ์์ผ๋ฉฐ ๊ฐ๊ฑฐ๋ ์๋ค๋ฉด ์ง๋๊ฐ ์ ์์ผ๋ฏ๋ก ๊ฑฐ๋ฆฌ๋ฅผ ๊ณ์ฐํ๊ฒ ๋ฉ๋๋ค. ์ ์กฐ๊ฑด์ ๊ฑธ๋ฆฌ์ง ์์ผ๋ฉด ๋ชจ๋ ์ขํ๋ฅผ ๋ฐฉ๋ฌธํ ๋๊น์ง ๊ฑฐ๋ฆฌ๋ฅผ 1์ฉ ๋์ ํด๊ฐ๋ฉฐ ์ต๋จ๊ฑฐ๋ฆฌ๋ฅผ ํ์ํฉ๋๋ค. ์ดํ ๊ฐฑ์ ๋ ์ต๋จ๊ฑฐ๋ฆฌ ๋ฒกํฐ๋ฅผ ๋ฆฌํดํฉ๋๋ค.
3. ์๋ฎฌ๋ ์ด์
time = solve(ocean, mDist, N, baby);
์ ํตํด ์ฃผ์ด์ง ๋งต์์ ๋จน์ ์ ์๋ ์์ด๋ฅผ ์์์ ์๋ง๊ฒ ๋จน๊ณ ์๊ธฐ ์์ด์ ๋ชธ์ง์ ํค์๋๋ค. ๋จน์ ์ ์๋ ์์ด๊ฐ ์๋ค๋ฉด ๊ทธ ์์ด๋ฅผ ๋จน๊ธฐ ์ํด ์ด๋ํ๋ ๊ฑฐ๋ฆฌ๋ฅผ ๋ฆฌํดํ๊ณ ๋จน์ ์ ์๋ ์์ด๊ฐ ์์ผ๋ฉด 0์ ๋ฆฌํดํฉ๋๋ค.
int solve(vii &ocean, vii &mdist, int N, Shark &baby) {
pqs sharks;
for (int i=0; i<N; i++) {
for (int j=0; j<N; j++) {
if (mdist[i][j]>0 && 1<=ocean[i][j] && ocean[i][j]<=baby.size) {
Shark shark(i, j, mdist[i][j]);
sharks.push(shark);
}
}
}
bool canEatFish = false;
Shark minShark(0, 0, 0);
while (!sharks.empty()) {
Shark shark = sharks.top();
sharks.pop();
if (baby.size > ocean[shark.r][shark.c]) {
canEatFish = true;
minShark = shark;
break;
}
}
if (canEatFish) {
baby.r = minShark.r;
baby.c = minShark.c;
if (baby.size > ocean[baby.r][baby.c]) {
ate++;
ocean[baby.r][baby.c] = 0;
}
if (ate >= baby.size) {
baby.size++;
ate = 0;
}
}
return minShark.size;
}
๋งด์์ ์์ด๊ฐ ์๋ ์ฅ์ ์ค ์๊ธฐ์์ด๊ฐ ์ง๋๊ฐ ์ ์๋ ์ฅ์๋ฅผ ๊ฐ์ค์น-ํ์ ๋ด์ต๋๋ค. ๊ฐ์ค์น-ํ์์ ์ง๋๊ฐ ์ ์๋ ์์ด๋ค์ด ์ ๋ ฌ๋๋ ์๋ฆฌ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
bool operator>(Shark a, Shark b) {
if (a.size > b.size) {
return true;
} else if (a.size == b.size && a.r > b.r) {
return true;
} else if (a.size == b.size && a.r == b.r && a.c > b.c) {
return true;
}
return false;
}
์๊ธฐ ์์ด๋ ์์ ์ ํฌ๊ธฐ๋ณด๋ค ํฐ ๋ฌผ๊ณ ๊ธฐ๊ฐ ์๋ ์นธ์ ์ง๋๊ฐ ์ ์๊ณ , ๋๋จธ์ง ์นธ์ ๋ชจ๋ ์ง๋๊ฐ ์ ์๋ค.
๋จน์ ์ ์๋ ๋ฌผ๊ณ ๊ธฐ๊ฐ 1๋ง๋ฆฌ๋ณด๋ค ๋ง๋ค๋ฉด, ๊ฑฐ๋ฆฌ๊ฐ ๊ฐ์ฅ ๊ฐ๊น์ด ๋ฌผ๊ณ ๊ธฐ๋ฅผ ๋จน์ผ๋ฌ ๊ฐ๋ค.
๊ฑฐ๋ฆฌ๊ฐ ๊ฐ๊น์ด ๋ฌผ๊ณ ๊ธฐ๊ฐ ๋ง๋ค๋ฉด, ๊ฐ์ฅ ์์ ์๋ ๋ฌผ๊ณ ๊ธฐ, ๊ทธ๋ฌํ ๋ฌผ๊ณ ๊ธฐ๊ฐ ์ฌ๋ฌ ๋ง๋ฆฌ๋ผ๋ฉด, ๊ฐ์ฅ ์ผ์ชฝ์ ์๋ ๋ฌผ๊ณ ๊ธฐ๋ฅผ ๋จน๋๋ค.
์๊ธฐ์์ด๊ฐ ์ด๋ ์ขํ๋ฅผ ์ง๋๊ฐ ์ ์๋์ง, ์ด๋ ์์ด๋ฅผ ๋จน์ ์ ์๋์ง ํน์ ๋จน์ผ๋ ค๋ ์์ด์ ์์๋ฅผ ๊ณ ๋ คํ ๋ ์์ ๊ฐ์ ๋ฌธ์ ์ ์กฐ๊ฑด์ ํ์ฉํฉ๋๋ค. ์ต์ฐ์ ์ ์ผ๋ก๋ ์๊ธฐ์์ด๊ฐ ๋ฐฉ๋ฌธํ ์ ์๋ ์ง์ญ์ค์์ ์์ด๊ฐ ์กด์ฌํ๋ ๊ณณ์ ์ดํด๋ด ๋๋ค. ์๊ธฐ์์ด์ ์ด๋ ์ขํ์ ์์ด์์ ํฌ๊ธฐ๋ฅผ ๋น๊ตํ์๋ ๊ฐ๊ฑฐ๋ ์์ ๊ฒฝ์ฐ๊ฐ ์๊ธฐ์์ด๊ฐ ๋จน์ ์ ์๋ ์์ด๋ค์ ๋ฆฌ์คํธ๋ฅผ ์์ฑํ๋๋ฐ ํ์ํ ์กฐ๊ฑด์ ๋๋ค. ์๊ธฐ์์ด๋ ๊ฐ์ฅ ๊ฐ๊น์ด ๊ฑฐ๋ฆฌ์ ์๋ ์์ด๋ฅผ ๋จน์ผ๋ฌ ๊ฐ์ง๋ง ๊ทธ๋ฌํ ๋ฌผ๊ณ ๊ธฐ๊ฐ ์ฌ๋ฌ ๋ง๋ฆฌ๋ผ๋ฉด ๊ฐ์ฅ ์์ชฝ ํ์ ์๋ ์์ด๋ฅผ ์ฐ์ ์ ์ผ๋ก ๋จน๊ณ , ๊ทธ๋ง์ ๋ ๊ฐ๋ค๋ฉด ๊ฐ์ฅ ์ผ์ชฝ ์ด์ ์๋ ์์ด๋ฅผ ๋จน์ผ๋ฌ ๊ฐ ์ ์๋๋ก ์ฐ์ฐ์ ์ค๋ฒ๋ก๋ฉ์ ํตํด ๊ฐ์ค์น-ํ์์ ์ ๋ ฌ๋๊ฒ ๋ง๋ญ๋๋ค.
์๊ธฐ ์์ด๋ ์์ ์ ํฌ๊ธฐ๋ณด๋ค ์์ ๋ฌผ๊ณ ๊ธฐ๋ง ๋จน์ ์ ์๋ค.
์๊ธฐ ์์ด๋ ์์ ์ ํฌ๊ธฐ์ ๊ฐ์ ์์ ๋ฌผ๊ณ ๊ธฐ๋ฅผ ๋จน์ ๋๋ง๋ค ํฌ๊ธฐ๊ฐ 1 ์ฆ๊ฐํ๋ค.
๊ฐ์ค์น ํ์ ๋ด๊ธด ์์ด๋ค ์ค์๋ ์๊ธฐ ์์ด์ ํฌ๊ธฐ ๊ฐ์์ ๋จน์ ์ ์๋ ์์ด๋ค๋ ์๊ณ ํฌ๊ธฐ๊ฐ ์์์ ๋จน์ ์ ์๋ ์์ด๋ ์์ฌ์์ต๋๋ค. ์ฆ, ํน์ ํ ๊ฒฝ์ฐ์ ๋งต์์ ์๊ธฐ์์ด์ ํฌ๊ธฐ๊ฐ ๊ฐ์ ์์ด๋ค๋ง ๋จ๋๋ค๋ฉด ์๊ณ ๋ฆฌ์ฆ์ ์ ํ์ฑ์ ๋ง์กฑ์ํฌ ์ ์๋ ์ํฉ์ด ๋ฐ์ํ ์ ์๋ค๋ ์ ์
๋๋ค. ์ด๋ฌํ ๋ฌธ์ ์ ์ ํด๊ฒฐํ๊ธฐ ์ํด ๋์
๋ ๊ฐ๋
์ด bool canEatFish = false;
์
๋๋ค. ์๊ธฐ์์ด๊ฐ ์ง๋๊ฐ ์ ์๋ ์์ด๊ฐ ๋ด๊ธด ๊ฐ์ค์น-ํ์์ ์์ด๋ฅผ ํ๋์ฉ ๊บผ๋ด๋ณด๋ฉด์ ์๊ธฐ์์ด๊ฐ ๋จน์ ์ ์๋์ง ํ์ธํฉ๋๋ค. ๋ง์ฝ ์๊ธฐ์์ด๊ฐ ๋จน์ ์ ์๋ ์์ด๊ฐ ์ฒ์์ผ๋ก ๋ฑ์ฅํ๋ค๋ฉด ๊ทธ ์์ด๋ ์๊ธฐ์์ด๊ฐ ๋จน์ ์ ์๋ ์์ด๋ค ์ค์ ์ต์ฐ์ ์ ์ผ๋ก ๋จน์ด์ผ ํ๋ ์์ด๊ฐ ๋๋ฉฐ minShark
๊ฐ์ฒด๋ก ์ ์ฅ๋ฉ๋๋ค. ๋ํ canEatFish
๋ณ์๊ฐ ์ฐธ๊ฐ์ผ๋ก ๋ฐ๋์ด ์๊ธฐ์์ด๊ฐ ์ฑ์ฅํ ์ ์๋์ง ๊ณ ๋ คํ ์ ์๊ฒ๋ฉ๋๋ค. ์๊ธฐ์์ด๊ฐ ๋ช ๋ง๋ฆฌ๋ฅผ ๋จน์๋์ง๋ ์ ์ญ ๋ณ์์ธ ate
์ ๊ธฐ๋ก๋๊ณ ์๊ธฐ์์ด์ ํ์ฌ ํฌ๊ธฐ์ ๊ฐ์ ์์ ๋ฌผ๊ณ ๊ธฐ๋ฅผ ๋จน์ ๋๋ง๋ค 1์ฉ ์ฆ๊ฐ์ํค๊ฒ ๋ฉ๋๋ค.
์ ๋ฆฌํ์๋ฉด canEatFish
๊ฐ ์ฐธ์ด ๋์ด์ minShark
์ ์๋ก์ด ์ขํ, ์๊ธฐ์์ด์์ ์ต๋จ๊ฑฐ๋ฆฌ ๊ฐ์ด ๋ด๊ธฐ๊ฒ ๋๋ค๋ฉด ์ต๋จ๊ฑฐ๋ฆฌ๋ฅผ ๋ฆฌํด ํ์ง๋ง canEatFish
๊ฐ ๊ฑฐ์ง์ด์ด์ ๋จน์ ์ ์๋ ์์ด๊ฐ ์๋ค๋ฉด minShark์ ๊ธฐ๋ณธ ๊ฑฐ๋ฆฌ ๊ฐ์ธ 0์ด ๋ฆฌํด๋๊ณ main ํจ์์ ์ด ๊ฐ์ ์ฐธ์กฐํ์ฌ ๋ฐ๋ณต๋ฌธ์ ๋๋ฆฌ๋ ๋ถ๋ถ์ด ๋์ํ๊ฒ ๋ฉ๋๋ค.
4. ์ถ๋ ฅ
์๊ธฐ ์์ด๊ฐ ๋จน์ ์ ์๋ ๋ชจ๋ ์์ด๋ฅผ ์ก์๋จน์ ๋๊น์ง ์ด๋ํ๋ ๊ฑฐ๋ฆฌ๋ฅผ int total = 0;
์ ๋์ ํ๊ณ cout << total << '\n';
๊ฒฐ๊ณผ๋ฌผ์ ์ถ๋ ฅํฉ๋๋ค.
๊ตํ
๋ฌธ์ ๋ฅผ ์ ์ฝ๊ณ ์ดํดํ๋ ๊ฒ๋ ๋ฅ๋ ฅ์ ๋๋ค. ('20.08.23)
์ ์ฒด ์ฝ๋
#include <bits/stdc++.h>
using namespace std;
struct Shark {
int r;
int c;
int size;
Shark(int r, int c, int s) {
this->r = r;
this->c = c;
this->size = s;
}
};
bool operator>(Shark a, Shark b) {
if (a.size > b.size) {
return true;
} else if (a.size == b.size && a.r > b.r) {
return true;
} else if (a.size == b.size && a.r == b.r && a.c > b.c) {
return true;
}
return false;
}
typedef vector<int> vi;
typedef vector<vi> vii;
typedef vector<Shark> vs;
typedef queue<Shark> qs;
typedef priority_queue<Shark, vs, greater<Shark> > pqs;
const int INF = 987654321;
int ate = 0;
vii calculate(vii &ocean, int N, Shark &baby) {
vii visited(N, vi(N, 0));
vii mdist(N, vi(N, -1));
qs q;
q.push(baby);
visited[baby.r][baby.c] = true;
mdist[baby.r][baby.c] = 0;
while (!q.empty()) {
Shark x = q.front(); q.pop();
vs dir = {
Shark(x.r-1, x.c, x.size), Shark(x.r, x.c-1, x.size),
Shark(x.r+1, x.c, x.size), Shark(x.r, x.c+1, x.size)
};
for (Shark each : dir) {
if (each.r<0 || each.c<0) continue;
if (each.r>=N || each.c>=N) continue;
if (visited[each.r][each.c]) continue;
if (ocean[each.r][each.c] > baby.size) {
visited[each.r][each.c] = true;
continue;
}
mdist[each.r][each.c] = mdist[x.r][x.c] + 1;
visited[each.r][each.c] = true;
q.push(each);
}
}
return mdist;
}
int solve(vii &ocean, vii &mdist, int N, Shark &baby) {
pqs sharks;
for (int i=0; i<N; i++) {
for (int j=0; j<N; j++) {
if (mdist[i][j]>0 && 1<=ocean[i][j] && ocean[i][j]<=baby.size) {
Shark shark(i, j, mdist[i][j]);
sharks.push(shark);
}
}
}
bool canEatFish = false;
Shark minShark(0, 0, 0);
while (!sharks.empty()) {
Shark shark = sharks.top();
sharks.pop();
if (baby.size > ocean[shark.r][shark.c]) {
canEatFish = true;
minShark = shark;
break;
}
}
if (canEatFish) {
baby.r = minShark.r;
baby.c = minShark.c;
if (baby.size > ocean[baby.r][baby.c]) {
ate++;
ocean[baby.r][baby.c] = 0;
}
if (ate >= baby.size) {
baby.size++;
ate = 0;
}
}
return minShark.size;
}
Shark placeFishTo(vii &ocean, int N) {
Shark baby(0, 0, 2);
for (int r=0; r<N; r++) {
for (int c=0; c<N; c++) {
cin >> ocean[r][c];
if (ocean[r][c] == 9) {
baby.r = r;
baby.c = c;
ocean[r][c] = 0;
}
}
}
return baby;
}
int main(void) {
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int N;
cin >> N;
vii ocean(N, vi(N, 0));
Shark baby = placeFishTo(ocean, N);
int time = INF;
int total = 0;
while (time) {
vii mDist = calculate(ocean, N, baby);
time = solve(ocean, mDist, N, baby);
total += time;
}
cout << total << '\n';
return 0;
}
'๐ฅ Computer Science > Programming' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[C++] ๋ณด๊ดํจ (0) | 2019.10.19 |
---|---|
[C++] ์ ๋ ฌ (Sorting) (0) | 2019.10.19 |
[C++] ํ๋ก๊ทธ๋๋ฐ์ ์ํ ํ ํ๋ฆฟ (Cheat sheet) (0) | 2019.10.05 |