[BOJ][๐ŸŸก5][๋ฐฑ์ค€#21610] ๋งˆ๋ฒ•์‚ฌ ์ƒ์–ด์™€ ๋น„๋ฐ”๋ผ๊ธฐ

์ž‘์„ฑ:    

์—…๋ฐ์ดํŠธ:

์นดํ…Œ๊ณ ๋ฆฌ:

ํƒœ๊ทธ: , , ,

๋ฌธ์ œ ์ถœ์ฒ˜

BAEKJOON Online Judge #21610


๋ฌธ์ œ

๋งˆ๋ฒ•์‚ฌ ์ƒ์–ด๋Š”ย ํŒŒ์ด์–ด๋ณผ,ย ํ† ๋„ค์ด๋„, ํŒŒ์ด์–ด์Šคํ†ฐ, ๋ฌผ๋ณต์‚ฌ๋ฒ„๊ทธย ๋งˆ๋ฒ•์„ ํ•  ์ˆ˜ ์žˆ๋‹ค. ์˜ค๋Š˜ ์ƒˆ๋กœ ๋ฐฐ์šด ๋งˆ๋ฒ•์€ ๋น„๋ฐ”๋ผ๊ธฐ์ด๋‹ค. ๋น„๋ฐ”๋ผ๊ธฐ๋ฅผ ์‹œ์ „ํ•˜๋ฉด ํ•˜๋Š˜์— ๋น„๊ตฌ๋ฆ„์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค. ์˜ค๋Š˜์€ ๋น„๋ฐ”๋ผ๊ธฐ๋ฅผ ํฌ๊ธฐ๊ฐ€ Nร—N์ธ ๊ฒฉ์ž์—์„œ ์—ฐ์Šตํ•˜๋ ค๊ณ  ํ•œ๋‹ค. ๊ฒฉ์ž์˜ ๊ฐ ์นธ์—๋Š” ๋ฐ”๊ตฌ๋‹ˆ๊ฐ€ ํ•˜๋‚˜ ์žˆ๊ณ , ๋ฐ”๊ตฌ๋‹ˆ๋Š” ์นธ ์ „์ฒด๋ฅผ ์ฐจ์ง€ํ•œ๋‹ค. ๋ฐ”๊ตฌ๋‹ˆ์— ์ €์žฅํ•  ์ˆ˜ ์žˆ๋Š” ๋ฌผ์˜ ์–‘์—๋Š” ์ œํ•œ์ด ์—†๋‹ค. (r, c)๋Š” ๊ฒฉ์ž์˜ rํ–‰ c์—ด์— ์žˆ๋Š” ๋ฐ”๊ตฌ๋‹ˆ๋ฅผ ์˜๋ฏธํ•˜๊ณ , A[r][c]๋Š” (r, c)์— ์žˆ๋Š” ๋ฐ”๊ตฌ๋‹ˆ์— ์ €์žฅ๋˜์–ด ์žˆ๋Š” ๋ฌผ์˜ ์–‘์„ ์˜๋ฏธํ•œ๋‹ค. ๊ฒฉ์ž์˜ ๊ฐ€์žฅ ์™ผ์ชฝ ์œ— ์นธ์€ (1, 1)์ด๊ณ , ๊ฐ€์žฅ ์˜ค๋ฅธ์ชฝ ์•„๋žซย ์นธ์€ (N, N)์ด๋‹ค. ๋งˆ๋ฒ•์‚ฌ ์ƒ์–ด๋Š” ์—ฐ์Šต์„ ์œ„ํ•ด 1๋ฒˆ ํ–‰๊ณผ N๋ฒˆ ํ–‰์„ ์—ฐ๊ฒฐํ–ˆ๊ณ , 1๋ฒˆ ์—ด๊ณผ N๋ฒˆ ์—ด๋„ ์—ฐ๊ฒฐํ–ˆ๋‹ค. ์ฆ‰, N๋ฒˆ ํ–‰์˜ ์•„๋ž˜์—๋Š” 1๋ฒˆ ํ–‰์ด,ย 1๋ฒˆ ํ–‰์˜ ์œ„์—๋Š” N๋ฒˆ ํ–‰์ด ์žˆ๊ณ , 1๋ฒˆ ์—ด์˜ ์™ผ์ชฝ์—๋Š” N๋ฒˆ ์—ด์ด, N๋ฒˆ ์—ด์˜ ์˜ค๋ฅธ์ชฝ์—๋Š” 1๋ฒˆ ์—ด์ด ์žˆ๋‹ค. ๋น„๋ฐ”๋ผ๊ธฐ๋ฅผย ์‹œ์ „ํ•˜๋ฉด (N, 1), (N, 2), (N-1, 1), (N-1, 2)์— ๋น„๊ตฌ๋ฆ„์ด ์ƒ๊ธด๋‹ค. ๊ตฌ๋ฆ„์€ ์นธ ์ „์ฒด๋ฅผ ์ฐจ์ง€ํ•œ๋‹ค. ์ด์ œ ๊ตฌ๋ฆ„์— ์ด๋™์„ M๋ฒˆ ๋ช…๋ นํ•˜๋ ค๊ณ  ํ•œ๋‹ค. i๋ฒˆ์งธ ์ด๋™ ๋ช…๋ น์€ ๋ฐฉํ–ฅ di๊ณผ ๊ฑฐ๋ฆฌ si๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๋‹ค. ๋ฐฉํ–ฅ์€ ์ด 8๊ฐœ์˜ ๋ฐฉํ–ฅ์ด ์žˆ์œผ๋ฉฐ, 8๊ฐœ์˜ ์ •์ˆ˜๋กœ ํ‘œํ˜„ํ•œ๋‹ค. 1๋ถ€ํ„ฐ ์ˆœ์„œ๋Œ€๋กœย โ†,ย โ†–,ย โ†‘,ย โ†—,ย โ†’,ย โ†˜,ย โ†“,ย โ†™ ์ด๋‹ค.ย ์ด๋™์„ ๋ช…๋ นํ•˜๋ฉด ๋‹ค์Œ์ด ์ˆœ์„œ๋Œ€๋กœ ์ง„ํ–‰๋œ๋‹ค.

๋ชจ๋“  ๊ตฌ๋ฆ„์ด di ๋ฐฉํ–ฅ์œผ๋กœ si์นธ ์ด๋™ํ•œ๋‹ค. ๊ฐ ๊ตฌ๋ฆ„์—์„œ ๋น„๊ฐ€ ๋‚ด๋ คย ๊ตฌ๋ฆ„์ด ์žˆ๋Š” ์นธ์˜ ๋ฐ”๊ตฌ๋‹ˆ์— ์ €์žฅ๋œ ๋ฌผ์˜ ์–‘์ด 1 ์ฆ๊ฐ€ํ•œ๋‹ค. ๊ตฌ๋ฆ„์ด ๋ชจ๋‘ ์‚ฌ๋ผ์ง„๋‹ค. 2์—์„œ ๋ฌผ์ด ์ฆ๊ฐ€ํ•œ ์นธ (r, c)์— ๋ฌผ๋ณต์‚ฌ๋ฒ„๊ทธ ๋งˆ๋ฒ•์„ ์‹œ์ „ํ•œ๋‹ค. ๋ฌผ๋ณต์‚ฌ๋ฒ„๊ทธ ๋งˆ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋ฉด, ๋Œ€๊ฐ์„  ๋ฐฉํ–ฅ์œผ๋กœ ๊ฑฐ๋ฆฌ๊ฐ€ 1์ธย ์นธ์— ๋ฌผ์ด ์žˆ๋Š” ๋ฐ”๊ตฌ๋‹ˆ์˜ ์ˆ˜๋งŒํผ (r, c)์— ์žˆ๋Š” ๋ฐ”๊ตฌ๋‹ˆ์˜ ๋ฌผ์ด ์–‘์ด ์ฆ๊ฐ€ํ•œ๋‹ค.

์ด๋•Œ๋Š” ์ด๋™๊ณผ ๋‹ค๋ฅด๊ฒŒ ๊ฒฝ๊ณ„๋ฅผ ๋„˜์–ด๊ฐ€๋Š” ์นธ์€ ๋Œ€๊ฐ์„  ๋ฐฉํ–ฅ์œผ๋กœ ๊ฑฐ๋ฆฌ๊ฐ€ 1์ธ ์นธ์ด ์•„๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, (N, 2)์—์„œ ์ธ์ ‘ํ•œ ๋Œ€๊ฐ์„  ์นธ์€ (N-1, 1), (N-1, 3)์ด๊ณ , (N, N)์—์„œ ์ธ์ ‘ํ•œ ๋Œ€๊ฐ์„  ์นธ์€ (N-1, N-1)๋ฟ์ด๋‹ค.

๋ฐ”๊ตฌ๋‹ˆ์— ์ €์žฅ๋œ ๋ฌผ์˜ ์–‘์ด 2 ์ด์ƒ์ธ ๋ชจ๋“  ์นธ์— ๊ตฌ๋ฆ„์ด ์ƒ๊ธฐ๊ณ , ๋ฌผ์˜ ์–‘์ด 2 ์ค„์–ด๋“ ๋‹ค. ์ด๋•Œ ๊ตฌ๋ฆ„์ด ์ƒ๊ธฐ๋Š” ์นธ์€ 3์—์„œ ๊ตฌ๋ฆ„์ด ์‚ฌ๋ผ์ง„ ์นธ์ด ์•„๋‹ˆ์–ด์•ผ ํ•œ๋‹ค.

M๋ฒˆ์˜ ์ด๋™์ด ๋ชจ๋‘ ๋๋‚œ ํ›„ ๋ฐ”๊ตฌ๋‹ˆ์— ๋“ค์–ด์žˆ๋Š” ๋ฌผ์˜ ์–‘์˜ ํ•ฉ์„ ๊ตฌํ•ด๋ณด์ž.


์ž…๋ ฅ

์ฒซ์งธ ์ค„์— N, M์ด ์ฃผ์–ด์ง„๋‹ค. ๋‘˜์งธ ์ค„๋ถ€ํ„ฐ N๊ฐœ์˜ ์ค„์—๋Š” N๊ฐœ์˜ ์ •์ˆ˜๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. r๋ฒˆ์งธ ํ–‰์˜ c๋ฒˆ์งธ ์ •์ˆ˜๋Š” A[r][c]๋ฅผ ์˜๋ฏธํ•œ๋‹ค. ๋‹ค์Œ M๊ฐœ์˜ ์ค„์—๋Š” ์ด๋™์˜ ์ •๋ณด di, si๊ฐ€ ์ˆœ์„œ๋Œ€๋กœ ํ•œ ์ค„์— ํ•˜๋‚˜์”ฉ ์ฃผ์–ด์ง„๋‹ค.


์ถœ๋ ฅ

์ฒซ์งธ ์ค„์— M๋ฒˆ์˜ ์ด๋™์ด ๋ชจ๋‘ ๋๋‚œ ํ›„ ๋ฐ”๊ตฌ๋‹ˆ์— ๋“ค์–ด์žˆ๋Š” ๋ฌผ์˜ ์–‘์˜ ํ•ฉ์„ ์ถœ๋ ฅํ•œ๋‹ค.


์ œํ•œ

2 โ‰ค N โ‰ค 50 1 โ‰ค M โ‰ค 100 0 โ‰ค A[r][c] โ‰ค 100 1 โ‰ค di โ‰ค 8 1 โ‰ค si โ‰ค 50


์˜ˆ์ œ

์˜ˆ์ œ 1

์ž…๋ ฅ

5 4
0 0 1 0 2
2 3 2 1 0
4 3 2 9 0
1 0 2 9 0
8 8 2 1 0
1 3
3 4
8 1
4 8


์ถœ๋ ฅ

77


์˜ˆ์ œ 2

์ž…๋ ฅ

5 8
0 0 1 0 2
2 3 2 1 0
0 0 2 0 0
1 0 2 0 0
0 0 2 1 0
1 9
2 8
3 7
4 6
5 5
6 4
7 3
8 2


์ถœ๋ ฅ

41


์˜ˆ์ œ 3

์ž…๋ ฅ

5 8
100 100 100 100 100
100 100 100 100 100
100 100 100 100 100
100 100 100 100 100
100 100 100 100 100
8 1
7 1
6 1
5 1
4 1
3 1
2 1
1 1


์ถœ๋ ฅ

2657


My Sol

def main():
    def move():
        d, s = map(int, input().split())
        di, dj = DD[d]
        for i in range(len(clouds)):
            ci, cj = clouds[i]
            si = check_over(ci+di*s)
            sj = check_over(cj+dj*s)
            clouds[i] = (si, sj)

    def check_over(n):
        while n < 0: n += N
        while n >= N: n -= N
        return n

    def rain():
        for ci, cj in clouds:
            mat[ci][cj] += 1

    def copy_water():
        for ci, cj in clouds:
            cnt_around = count_around(ci, cj)
            mat[ci][cj] += cnt_around

    def count_around(i, j):
        cnt_around = 0
        for di, dj in ((-1,-1),(-1,1),(1,-1),(1,1)):
            si, sj = i+di, j+dj
            if not (0<=si<N and 0<=sj<N): continue
            if not mat[si][sj]: continue
            cnt_around += 1
        return cnt_around

    def make_cloud(clouds):
        new_clouds = []
        clouds_set = set(clouds)
        for i in range(N):
            for j in range(N):
                if (i, j) in clouds_set: continue
                if mat[i][j] < 2: continue
                mat[i][j] -= 2
                new_clouds.append((i, j))
        return new_clouds

    def count_mat():
        cnt = 0
        for i in range(N):
            for j in range(N):
                cnt += mat[i][j]
        return cnt

    N, M = map(int, input().split())
    DD = [(0,0),(0,-1),(-1,-1),(-1,0),(-1,1),(0,1),(1,1),(1,0),(1,-1)]
    mat = [list(map(int, input().split())) for _ in range(N)]
    clouds = [(N-1,0),(N-1,1),(N-2,0),(N-2,1)]
    for _ in range(M):
        move()
        rain()
        copy_water()
        clouds = make_cloud(clouds)
    return count_mat()

print(main())

๋‚˜๋ฆ„ ๋นก๋นกํ•œ ๊ตฌํ˜„์ด ํ•„์š”ํ•œ ๋ฌธ์ œ์˜€์ง€๋งŒ ๋‹จ๊ณ„์ ์œผ๋กœ ์ ‘๊ทผํ•˜๋ฉด ์‰ฝ๊ฒŒ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ์˜€๋‹ค. ํ•จ์ˆ˜์˜ ์—ญํ• ์„ ๊ตฌ๋ถ„ํ•˜์—ฌ ์ฒ ์ €ํ•˜๊ฒŒ ์ž‘์€ ๋‹จ์œ„๋กœ ์ž˜๋ผ ์ž‘์„ฑํ–ˆ๋‹ค.

  1. ์ž…๋ ฅ์„ ๋ฐ›์•„ 2์ฐจ์› ๋ฐฐ์—ด mat์„ ๋งŒ๋“ ๋‹ค. ๋ฌผ์˜ ์–‘์„ ๊ธฐ๋กํ•˜๋Š” ๊ฒฉ์ž๊ฐ€ ๋  ๊ฒƒ์ด๋‹ค.
  2. ์ตœ์ดˆ์˜ ๊ตฌ๋ฆ„์€ ์™ผ์ชฝ ํ•˜๋‹จ 2x2 ํฌ๊ธฐ์˜ ๊ตฌ๋ฆ„์ด๋ฏ€๋กœ clouds ๋ณ€์ˆ˜๋ฅผ ๋‘์–ด ๊ตฌ๋ฆ„์˜ ๊ฐ ์ขŒํ‘œ๋ฅผ ์ €์žฅํ•œ๋‹ค.
  3. MํšŒ์˜ ๋ฐ˜๋ณต์„ ํ•˜๋Š” ๊ฒƒ์„ ์—ผ๋‘์— ๋‘๊ณ  for๋ฌธ์„ ๋‘”๋‹ค.
  4. ๊ตฌ๋ฆ„์„ ์ด๋™์‹œํ‚ค๋Š” move ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ•œ๋‹ค. ์ด๋™ ๋ฐฉํ–ฅ๊ณผ ์ด๋™ ๊ฑฐ๋ฆฌ๋ฅผ ์ž…๋ ฅ ๋ฐ›๊ณ , ํ•ด๋‹น ์ด๋™๋ฐฉํ–ฅ ์ธ๋ฑ์Šค๋ฅผ DD ๋ฐฐ์—ด์—์„œ ์ฐพ์•„ di, dj๋ฅผ ๊ตฌํ•œ๋‹ค.
  5. clouds ๋‚ด๋ถ€ ์ขŒํ‘œ๋“ค๋งˆ๋‹ค ์ด๋™์‹œํ‚จ ๋’ค, ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚œ๋‹ค๋ฉด ๋ฒ”์œ„ ๋‚ด๋กœ ์ขŒํ‘œ๋ฅผ ์žฌ์กฐ์ •ํ•˜๋Š” ํ•จ์ˆ˜ check_over๋ฅผ ๋งŒ๋“ค์–ด ์ขŒํ‘œ๋ฅผ ์žฌ์กฐ์ • ์ฒ˜๋ฆฌํ•˜์—ฌ clouds ๋ณ€์ˆ˜์˜ ๊ฐ ์ขŒํ‘œ๋ฅผ ์ฒ˜๋ฆฌํ•œ๋‹ค. ์ฆ‰, ๊ตฌ๋ฆ„์„ ์˜ฎ๊ธฐ๋Š” ๊ฒƒ์ด๋‹ค.
  6. ์ƒ์„ฑ๋œ ๊ตฌ๋ฆ„๋งˆ๋‹ค ๋น„๋ฅผ ๋‚ด๋ ค mat์˜ ๊ฐ ์ขŒํ‘œ์— 1์„ ์ถ”๊ฐ€ํ•˜๋Š” ํ•จ์ˆ˜ rain์„ ์ž‘์„ฑํ•œ๋‹ค.
  7. ๋ฌผ ๋ณต์‚ฌ๋ฅผ ํ•˜๋Š” copy_water ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ•œ๋‹ค. ๊ตฌ๋ฆ„์˜ ๊ฐ ์ขŒํ‘œ๋งˆ๋‹ค ์ฃผ๋ณ€์„ ํ™•์ธํ•˜๋Š” ํ•จ์ˆ˜ count_around ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ•˜์—ฌ ๋Œ€๊ฐ์„  4๊ฐœ์˜ ์ขŒํ‘œ๋กœ๋ถ€ํ„ฐ ์ถ”๊ฐ€ํ•  ๋ฐ”๊ตฌ๋‹ˆ์˜ ๋ฌผ์˜ ์–‘์„ ๊ณ„์‚ฐํ•˜์—ฌ ์ถ”๊ฐ€ํ•œ๋‹ค.
  8. count_around ํ•จ์ˆ˜๋Š” ๊ฒฉ์ž๋ฅผ ๋ฒ—์–ด๋‚˜๊ฑฐ๋‚˜ ๊ฐ’์ด ์—†์œผ๋ฉด ์นด์šดํŠธ๋ฅผ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ 2๊ฐ€์ง€ ์ƒํ™ฉ์„ ์ œ์™ธํ•œ ๋‚˜๋จธ์ง€์—์„œ๋Š” ์นด์šดํŠธ๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค. ์ด๋ฅผ 4๊ฐœ ์ขŒํ‘œ ๋ชจ๋‘ ํ™•์ธํ•˜์—ฌ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
  9. ๊ตฌ๋ฆ„์„ ๋‹ค์‹œ ๋งŒ๋“œ๋Š” ํ•จ์ˆ˜ make_cloud ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ•œ๋‹ค. NxN์˜ ์ „์ฒด ์ขŒํ‘œ๋ฅผ ๋ชจ๋‘ ์™„์ „ํƒ์ƒ‰ํ•˜๋Š”๋ฐ, ๋ฌธ์ œ ์กฐ๊ฑด ์ค‘ ๊ธฐ์กด์— ๊ตฌ๋ฆ„์ด ์‚ฌ๋ผ์ง„, ์ฆ‰ clouds์— ์žˆ๋Š” ์ขŒํ‘œ์—์„œ๋Š” ๊ตฌ๋ฆ„์ด ์ƒ๊ธฐ๋ฉด ์•ˆ ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ด๋ฅผ ํ™•์ธํ•œ๋‹ค. ์ด ์ค‘ 2๊ฐ€ ๋„˜๋Š” ๋ชจ๋“  ์นธ์„ new_clouds์— ๋‹ด์€ ๋’ค, ๋ชจ๋“  ์™„์ „ํƒ์ƒ‰์„ ๋งˆ์น˜๋ฉด ์ด๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
  10. main ํ•จ์ˆ˜ ๋‚ด์˜ clouds๋ฅผ ์œ„์˜ new_clouds๋กœ ๋Œ€์ฒดํ•œ๋‹ค. ์ด๋ฅผ MํšŒ ๋ฐ˜๋ณตํ•œ๋‹ค.
  11. ๋ชจ๋“  ๋ฐ˜๋ณต์„ ์ฒ˜๋ฆฌํ•œ mat์˜ ๊ฐ ์ขŒํ‘œ์˜ ๊ฐ’์„ ๋ชจ๋‘ ๋ˆ„์ ํ•ด ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜ count_mat์„ ์ž‘์„ฑํ•œ๋‹ค.
  12. main ํ•จ์ˆ˜์˜ return๊ฐ’์„ ์ถœ๋ ฅํ•œ๋‹ค.


๊ฒฐ๊ณผ

๋งž์•˜์Šต๋‹ˆ๋‹ค!!

๋Œ“๊ธ€๋‚จ๊ธฐ๊ธฐ