๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

Algorithm/BOJ

[BOJ] ๋ฏธ์„ธ๋จผ์ง€ ์•ˆ๋…•!(17144)

[๋ฐฑ์ค€(BOJ)] ๋ฏธ์„ธ๋จผ์ง€ ์•ˆ๋…•!(17144) C++

๋ฌธ์ œ : BOJ_17144๋ฒˆ ๋ฏธ์„ธ๋จผ์ง€ ์•ˆ๋…•!

๋ฌธ์ œ ์„ค๋ช…

์™„์ „ํƒ์ƒ‰, bfs

ํฌ๊ธฐ๊ฐ€ R*C์ธ ๊ฒฉ์žํŒ์—์„œ ๋ฏธ์„ธ๋จผ์ง€๊ฐ€ 4๋ฐฉํ–ฅ์œผ๋กœ ํ™•์žฅ๋œ ๋’ค, ํ™•์žฅ๋œ ์ดํ›„์— ๊ณต๊ธฐ์ฒญ์ •๊ธฐ์— ์˜ํ•ด ์œ„์ชฝ์€ ๋ฐ˜์‹œ๊ณ„, ์•„๋ž˜์ชฝ์€ ์‹œ๊ณ„๋ฐฉํ–ฅ์œผ๋กœ ๋ฏธ์„ธ๋จผ์ง€๋“ค์ด ๋Œ์•„๊ฐ‘๋‹ˆ๋‹ค.

์ด ๋•Œ ๊ณต๊ธฐ์ฒญ์ •๊ธฐ์— ๋“ค์–ด๊ฐ„ ๋ฏธ์„ธ๋จผ์ง€๋Š” ์‚ฌ๋ผ์ง‘๋‹ˆ๋‹ค.


Solution

R๊ณผ C์˜ ์ตœ๋Œ“๊ฐ’์ด 50, T์˜ ์ตœ๋Œ“๊ฐ’์ด 1000์ด๊ธฐ ๋•Œ๋ฌธ์—, 50501,000=2,500,000์ž„์œผ๋กœ ์™„์ „ํƒ์ƒ‰์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

๋ฏธ์„ธ๋จผ์ง€์˜ ์œ„์น˜์™€ ๊ฐ’์„ queue์— ๋‹ค ๋„ฃ์–ด์ฃผ๊ณ  4๋ฐฉํ–ฅ์— ํผํŠธ๋ฆฌ๋Š” bfs๋ฅผ ํ•œ ๋’ค, ๋‹จ์ˆœ for๋ฌธ์œผ๋กœ ๋ฐ˜์‹œ๊ณ„์™€ ์‹œ๊ณ„๋ฐฉํ–ฅ์œผ๋กœ ๋Œ๋ฆฌ๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ ํ’€์—ˆ์Šต๋‹ˆ๋‹ค.


Description

  1. queue์— ํ•ด๋‹น ์œ„์น˜์˜ ๊ฐ’, ํ–‰, ์—ด์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋„ฃ๊ธฐ์œ„ํ•ด pair๋ฅผ ์ด์ค‘์œผ๋กœ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.
  2. ๊ณต๊ธฐ์ฒญ์ •๊ธฐ์˜ ๊ฐ’์€ -1์ด๋ฏ€๋กœ, ๋งˆ์ง€๋ง‰ sum์— 2๋ฅผ ๋”ํ•ด์ค๋‹ˆ๋‹ค.
#include <iostream>
#include <queue>
#include <algorithm>
using namespace std;
int R, C, T;
int map[51][51];
int st, ed;
int dx[] = { 0,0,1,-1 };
int dy[] = { 1,-1,0,0 };
int main(void) {
    scanf("%d%d%d", &R, &C, &T);
    for (int i = 1; i <= R; i++) {
        for (int j = 1; j <= C; j++) {
            scanf("%d", &map[i][j]);
            if (map[i][j] == -1) {
                if (st == 0) st = i;
                else ed = i;
            }
        }
    }
    while (T--) {
        queue<pair<int, pair<int, int>>> q; // q.push({๊ฐ’,{ํ–‰,์—ด}});
        for (int i = 1; i <= R; i++) {
            for (int j = 1; j <= C; j++) {
                if (map[i][j] > 0) q.push({ map[i][j],{ i,j } });
            }
        }
        while (!q.empty()) {
            int x = q.front().second.first;
            int y = q.front().second.second;
            int now_val = q.front().first;
            q.pop();
            for (int i = 0; i < 4; i++) {
                int nx = x + dx[i];
                int ny = y + dy[i];
                if (map[nx][ny] == -1) continue;
                if (nx > R || ny > C || nx < 1 || ny < 1) continue;
                map[nx][ny] += now_val / 5;
                map[x][y] -= now_val / 5;
            }
        }
        // ๋ฐ˜์‹œ๊ณ„, ์‹œ๊ณ„๋ฐฉํ–ฅ์œผ๋กœ ๋Œ๋ฆฌ๊ธฐ ์œ„ํ•œ ๋‹จ์ˆœ ํฌ๋ฌธ
        for (int i = st - 1; i >= 2; i--) map[i][1] = map[i - 1][1];
        for (int i = 1; i < C; i++) map[1][i] = map[1][i + 1];
        for (int i = 1; i < st; i++) map[i][C] = map[i + 1][C];
        for (int i = C; i > 2; i--) map[st][i] = map[st][i - 1];
        map[st][2] = 0;
        for (int i = ed + 1; i < R; i++) map[i][1] = map[i + 1][1];
        for (int i = 1; i < C; i++) map[R][i] = map[R][i + 1];
        for (int i = R; i > ed; i--) map[i][C] = map[i - 1][C];
        for (int i = C; i > 2; i--) map[ed][i] = map[ed][i - 1];
        map[ed][2] = 0;
    }
    int sum = 0;
    for (int i = 1; i <= R; i++) {
        for (int j = 1; j <= C; j++) {
            sum += map[i][j];
        }
    }
    printf("%d\n", sum + 2);
    // ๊ณต๊ธฐ์ฒญ์ •๊ธฐ์˜ ๊ฐ’์€ -1์ด๋ฏ€๋กœ, ๋งˆ์ง€๋ง‰์— 2๋ฅผ ๋”ํ•ด์ค€๋‹ค.
}