๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ”ฅ PS(Problem Solving) ๐Ÿ”ฅ/BOJ

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

by dar0m! 2019. 10. 10.
์‹œ๊ฐ„ ์ œํ•œ ๋ฉ”๋ชจ๋ฆฌ ์ œํ•œ ์ •๋‹ต ๋น„์œจ
1 ์ดˆ 512 MB 54.847%

 

 

17144๋ฒˆ: ๋ฏธ์„ธ๋จผ์ง€ ์•ˆ๋…•!

๋ฏธ์„ธ๋จผ์ง€๋ฅผ ์ œ๊ฑฐํ•˜๊ธฐ ์œ„ํ•ด ๊ตฌ์‚ฌ๊ณผ๋Š” ๊ณต๊ธฐ์ฒญ์ •๊ธฐ๋ฅผ ์„ค์น˜ํ•˜๋ ค๊ณ  ํ•œ๋‹ค. ๊ณต๊ธฐ์ฒญ์ •๊ธฐ์˜ ์„ฑ๋Šฅ์„ ํ…Œ์ŠคํŠธํ•˜๊ธฐ ์œ„ํ•ด ๊ตฌ์‚ฌ๊ณผ๋Š” ์ง‘์„ ํฌ๊ธฐ๊ฐ€ R×C์ธ ๊ฒฉ์žํŒ์œผ๋กœ ๋‚˜ํƒ€๋ƒˆ๊ณ , 1×1 ํฌ๊ธฐ์˜ ์นธ์œผ๋กœ ๋‚˜๋ˆด๋‹ค. ๊ตฌ์‚ฌ๊ณผ๋Š” ๋›ฐ์–ด๋‚œ ์ฝ”๋”ฉ ์‹ค๋ ฅ์„ ์ด์šฉํ•ด ๊ฐ ์นธ (r, c)์— ์žˆ๋Š” ๋ฏธ์„ธ๋จผ์ง€์˜ ์–‘์„ ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๋Š” ์‹œ์Šคํ…œ์„ ๊ฐœ๋ฐœํ–ˆ๋‹ค. (r, c)๋Š” rํ–‰ c์—ด์„ ์˜๋ฏธํ•œ๋‹ค. ๊ณต๊ธฐ์ฒญ์ •๊ธฐ๋Š” ํ•ญ์ƒ ์™ผ์ชฝ ์—ด์— ์„ค์น˜๋˜์–ด ์žˆ๊ณ , ํฌ๊ธฐ๋Š” ๋‘ ํ–‰์„ ์ฐจ์ง€ํ•œ๋‹ค. ๊ณต๊ธฐ์ฒญ์ •๊ธฐ๊ฐ€ ์„ค์น˜๋˜์–ด ์žˆ์ง€ ์•Š์€ ์นธ์—๋Š” ๋ฏธ์„ธ๋จผ

www.acmicpc.net

 

ํ•ด๊ฒฐ๋ฐฉ์•ˆ

๋ฏธ์„ธ๋จผ์ง€ ํ™•์‚ฐํ•˜๋Š” ๋‹จ๊ณ„, ๊ณต๊ธฐ๊ฐ€ ์ˆœํ™˜ํ•˜๋Š” ๋‹จ๊ณ„๋ฅผ ๋‚˜๋ˆ ์„œ ๊ตฌํ˜„ํ•˜์˜€๋‹ค.

๋จผ์ € ๋ฏธ์„ธ๋จผ์ง€๊ฐ€ ํ™•์‚ฐํ•˜๋Š” ๋‹จ๊ณ„์—์„œ ์œ ์˜ํ•ด์•ผํ•  ์ ์ด ์žˆ๋‹ค. ํ•œ ๋ฒˆ ๋ฏธ์„ธ๋จผ์ง€๊ฐ€ ํ™•์‚ฐํ•  ๋•Œ๋Š” ์ด์ „ ๋˜๋Š” ์ดˆ๊ธฐ์˜ ๋ฏธ์„ธ๋จผ์ง€ ์ˆ˜์น˜์—์„œ ๋ชจ๋“  ๊ฐ’์„ ๊ณ„์‚ฐํ•œ ํ›„ ํ•ฉ์‚ฐํ•˜๋Š” ๋‹จ๊ณ„๋ฅผ ๊ฑฐ์ณ์•ผ ํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ๋ฐฐ์—ด์„ arr์™€ tmp ๋‘ ๊ฐœ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ arr์—์„œ ๊ธฐ์กด ๋ฏธ์„ธ๋จผ์ง€ ์ˆ˜์น˜๋ฅผ ์•Œ์•„๋ƒˆ๊ณ  tmp๋Š” ๋”ํ•ด์งˆ ๋ฏธ์„ธ๋จผ์ง€ ์ˆ˜๋ฅผ ์ €์žฅํ•ด๋‘์–ด ๋งˆ์ง€๋ง‰์— arr์— tmp ๊ฐ’์„ ๋”ํ–ˆ๋‹ค.

๊ณต๊ธฐ๊ฐ€ ์ˆœํ™˜ํ•  ๋•Œ๋Š” for ๋ฌธ 7๊ฐœ๋ฅผ ํ†ตํ•ด์„œ ๊ฐ’์„ ํ•˜๋‚˜ํ•˜๋‚˜์”ฉ ๋ฐ€์—ˆ๋Š”๋ฐ, ๋งž์€ ์‚ฌ๋žŒ ์ฝ”๋“œ๋ฅผ ๋ณด๊ณ  ๋” ์ข‹์€ ๋ฐฉ๋ฒ•์„ ์ฐพ์„ ์ˆ˜ ์žˆ์—ˆ๋‹ค.  ํ•ด๋‹น ๋ฐฉ๋ฒ•์€ ์•„๋ž˜์— ์ฒจ๋ถ€

 

๋ฉ”๋ชจ๋ฆฌ ์‹œ๊ฐ„
2012 KB 40 ms
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
#include<iostream>
#include<string.h>
#include<algorithm>
#include<vector>
#include<queue>
using namespace std;
typedef pair<intint> p;
int n, m, t, arr[55][55], tmp[55][55], ans; // t์ดˆ ํ›„ ๋ฏธ์„ธ๋จผ์ง€์˜ ์–‘์„ ์ถœ๋ ฅ.
int dx[] = { 0,1,0,-1 }, dy[] = { 1,0,-1,0 };
vector<int> aircleaner;
void spread(int r, int c) {
    int& A = arr[r][c];
    int cnt = 0;
    for (int i = 0; i < 4; i++) {
        int nr = r + dx[i];     int nc = c + dy[i];
        if (arr[nr][nc] != -1 && nr >= 0 && nr < n && nc >= 0 && nc < m) {
            tmp[nr][nc] += (A / 5); cnt++;
        }
    }
    A -= (A / 5* cnt;
}
int main() {
    scanf("%d%d%d"&n, &m, &t);
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            scanf("%d"&arr[i][j]);
            if (arr[i][j] == -1)aircleaner.push_back(i);
        }
    }
    while (t--) {
        // ๋ฏธ์„ธ๋จผ์ง€ ํ™•์‚ฐ
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                if (arr[i][j] > 0
                    spread(i, j);
            }
        }
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                arr[i][j] += tmp[i][j];
            }
        }
        memset(tmp, 0sizeof(tmp));
        // ๊ณต๊ธฐ ์ˆœํ™˜
        int row_ccw = aircleaner[0]; // counterclockwise
        int row_cw = aircleaner[1]; //clockwise
        for (int i = row_ccw - 1; i > 0; i--) {
            arr[i][0= arr[i - 1][0];
        }
        for (int i = row_cw + 1; i < n - 1; i++) {
            arr[i][0= arr[i + 1][0];
        }
        for (int j = 0; j < m - 1; j++) {
            arr[0][j] = arr[0][j + 1];
            arr[n - 1][j] = arr[n - 1][j + 1];
        }
        for (int i = 0; i < row_ccw; i++) {
            arr[i][m - 1= arr[i + 1][m - 1];
        }
        for (int i = n - 1; i > row_cw; i--) {
            arr[i][m - 1= arr[i - 1][m - 1];
        }
        for (int j = m - 1; j > 1; j--) {
            arr[row_ccw][j] = arr[row_ccw][j - 1];
        }    
        for (int j = m - 1; j > 1; j--) {
            arr[row_cw][j] = arr[row_cw][j - 1];
        }
        arr[row_ccw][1= 0; arr[row_cw][1= 0;
    }
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            if (arr[i][j] != -1)ans += arr[i][j];
        }
    }
    printf("%d", ans);
    return 0;
}
cs

 

์ฃผ์˜

memset ํ—ค๋”๋ฅผ ์ง€์ •์•ˆํ•ด์ค˜์„œ ํ•œ ๋ฒˆ ์ปดํŒŒ์ผ ์—๋Ÿฌ๊ฐ€ ๋‚˜์™”๋‹ค. 

memset์„ ์“ธ ๋•Œ string.h ํ—ค๋” ์žŠ์ง€ ์•Š๊ธฐ!

 

memset ๋Œ€์‹  ์“ธ ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•

while ๋ฌธ ์•ˆ์— ์ง€์—ญ๋ณ€์ˆ˜๋กœ

int tmp[55][55] = {0};

์ด์™€ ๊ฐ™์ด ์„ ์–ธํ•˜๋ฉด memset ํ•จ์ˆ˜๊ฐ€ ํ•„์š” ์—†์Œ.

 

for ๋ฌธ ๋” ๊ฐ„ํŽธํ•˜๊ฒŒ ์“ฐ๊ธฐ

#define F(x,y,u,p) for(int x=0; x<u; x++)for(int y=0;y<p;y++)

์ •์˜ํ•ด๋‘๋ฉด F(i, j, R, C) { } ๋กœ ์ด์ค‘ํฌ๋ฌธ์„ ๋Œ๋ฆด ์ˆ˜ ์žˆ๋‹ค. ์ด ๋•Œ i์™€ j์˜ ํ˜ผ๋™์ด ์ ์–ด์ ธ ์‹ค์ˆ˜๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค.

 

๋ฐฐ์—ด ์ˆœํ™˜ ๋” ์‰ฝ๊ฒŒ ํ•˜๊ธฐ

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
int dd[4][2= { {0,1},{-1,0},{0,-1},{1,0} }, dx[8= { 0,1,2,3,0,3,2,1 };
 
for (int i = 0; i < 2; i++) {
    int cn = 0, cm = 0, ii = q[i][0], jj = q[i][1];
    while (1) {
        int ni = ii + dd[dx[cz]][0], nj = jj + dd[dx[cz]][1];
        if (ni == q[i][0&& nj == 0) { cz++break; }
        if (chk(ni, nj)) { 
            cm = a[ni][nj]; 
            a[ni][nj] = cn; 
            cn = cm; 
            ii = ni; jj = nj; 
        }
        else cz++;
    }
}
cs

๋‚ด ์ฝ”๋“œ์—์„œ dx, dy ์˜€๋˜ ๋ฐฐ์—ด์„ ํ•ฉ์ณ dd๋ผ๋Š” ์ด์ฐจ์› ๋ฐฐ์—ด๋กœ ์ €์žฅ์‹œ์ผœ๋’€๊ณ , ๊ณต๊ธฐ์˜ ์ˆœํ™˜์„ ๋‚˜ํƒ€๋‚ด๊ธฐ ์œ„ํ•ด ๊ทธ ํ๋ฆ„๋Œ€๋กœ ์‹œ๊ณ„๋ฐฉํ–ฅ์œผ๋กœ ๋„๋Š” 0,1,2,3 ๊ณผ ๋ฐ˜ ์‹œ๊ณ„๋ฐฉํ–ฅ์œผ๋กœ ๋„๋Š” 0,3,2,1 ์„ dx ๋ฐฐ์—ด์— ์ €์žฅ์‹œ์ผœ dd[dx[cz]][0] ์™€ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ๊ณ„์†ํ•ด์„œ ๋”ํ•ด๊ฐ€๋ฉฐ ํƒ์ƒ‰ํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.

๋Œ“๊ธ€