๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
โญ Problem_Solving/๋ฐฑ์ค€

[๋ฐฑ์ค€] 20056 ๋งˆ๋ฒ•์‚ฌ ์ƒ์–ด์™€ ํŒŒ์ด์–ด๋ณผ (Python/ํŒŒ์ด์ฌ)

by ํฌ์ŠคํŠธ์‰์ดํฌ 2022. 10. 3.

<๋ฌธ์ œ ๋งํฌ>

https://www.acmicpc.net/problem/20056

 

20056๋ฒˆ: ๋งˆ๋ฒ•์‚ฌ ์ƒ์–ด์™€ ํŒŒ์ด์–ด๋ณผ

์ฒซ์งธ ์ค„์— N, M, K๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ๋‘˜์งธ ์ค„๋ถ€ํ„ฐ M๊ฐœ์˜ ์ค„์— ํŒŒ์ด์–ด๋ณผ์˜ ์ •๋ณด๊ฐ€ ํ•œ ์ค„์— ํ•˜๋‚˜์”ฉ ์ฃผ์–ด์ง„๋‹ค. ํŒŒ์ด์–ด๋ณผ์˜ ์ •๋ณด๋Š” ๋‹ค์„ฏ ์ •์ˆ˜ ri, ci, mi, si, di๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๋‹ค. ์„œ๋กœ ๋‹ค๋ฅธ ๋‘ ํŒŒ์ด์–ด๋ณผ์˜ ์œ„์น˜

www.acmicpc.net

<ํ’€์ด ์ „๋žต>

  1. ํŠน๋ณ„ํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ํ•„์š”๋กœ ํ•˜์ง€ ์•Š๋Š” ๊ตฌํ˜„ ๋ฌธ์ œ์ด๋‹ค.
  2. ์–ด๋–ค ์ž๋ฃŒ๊ตฌ์กฐํ˜•์„ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•ด์„œ ํŒŒ์ด์–ด๋ณผ์˜ ์ •๋ณด์™€ ์œ„์น˜ ๋“ฑ์„ ๋‚˜ํƒ€๋‚ผ ๊ฒƒ์ธ๊ฐ€๊ฐ€ ์ƒ๊ฐํ•˜๊ธฐ ์ข€ ๊นŒ๋‹ค๋กญ๋‹ค
  3. ๊ตฌํ˜„ํ•ด์•ผํ•  ์š”์†Œ๋Š” ํฌ๊ฒŒ ํŒŒ์ด์–ด๋ณผ์˜ ์ด๋™ / ํŒŒ์ด์–ด๋ณผ์˜ ๋ณ‘ํ•ฉ๊ณผ ๋ถ„์‚ฐ์ด๋‹ค.
  4. ๋จผ์ € ํŒŒ์ด์–ด๋ณผ์˜ ์ด๋™์ด๋‹ค.
    1. ํŒŒ์ด์–ด์–ด๋ณผ์˜ ์ด๋™์€ ๋ฆฌ์ŠคํŠธ์— ๋‹ด์€ ํŒŒ์ด์–ด๋ณผ์˜ ์ •๋ณด๋ฅผ ํ•˜๋‚˜์”ฉ ๊บผ๋‚ด์„œ ๋นˆ ๋ฆฌ์ŠคํŠธ๋ฅผ ์›์†Œ๋กœ ๊ฐ€์ง„ N x N ๋ฐฐ์—ด(๋ฆฌ์ŠคํŠธ๋ฅผ ์›์†Œ๋กœ ๊ฐ€์ง€๋ฏ€๋กœ3์ฐจ์› ๋ฐฐ์—ด์ด๋‹ค)์— ํ‘œ์‹œํ•ด์ฃผ์—ˆ๋‹ค.
    2. 1๋ฒˆ ํ–‰๊ณผ N๋ฒˆ ํ–‰์ด, 1๋ฒˆ ์—ด๊ณผ N๋ฒˆ ์—ด์ด ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ N์œผ๋กœ ๋‚˜๋ˆˆ ๋‚˜๋จธ์ง€๋กœ ์ขŒํ‘œ๋ฅผ ํ‘œ์‹œํ•ด์•ผํ•œ๋‹ค.
  5. ํŒŒ์ด์–ด๋ณผ์˜ ๋ณ‘ํ•ฉ๊ณผ ๋ถ„์‚ฐ์ด๋‹ค.
    1. ํŒŒ์ด์–ด๋ณผ์˜ ์ด๋™์—์„œ ํ–ˆ๋˜ ๊ฑฐ์˜ ์—ญ์ˆœ์œผ๋กœ ์ด๋ฒˆ์—๋Š” ๋ฐฐ์—ด์—์„œ ํŒŒ์ด์–ด๋ณผ์„ ๊บผ๋‚ด์„œ ๋‹ค์‹œ ๋ฆฌ์ŠคํŠธ์— ๋‹ด์•„์ค€๋‹ค.
    2. N x N ๋ฐฐ์—ด์— ์›์†Œ๊ฐ€ 2๊ฐœ ์ด์ƒ ์žˆ์œผ๋ฉด ๋ฌธ์ œ์— ์ฃผ์–ด์ง„ ์กฐ๊ฑด๋Œ€๋กœ ๋ณ‘ํ•ฉ๊ณผ ๋ถ„์‚ฐ์„ ๊ตฌํ˜„ํ•ด ์ˆ˜ํ–‰ํ•ด์ค€๋‹ค.
    3. 1๊ฐœ์ผ ๊ฒฝ์šฐ์—๋Š” ๋”ฐ๋กœ ํ•  ๊ฒŒ ์—†์œผ๋ฏ€๋กœ ๊ทธ๋Œ€๋กœ ๋‹ค์‹œ ๋ฆฌ์ŠคํŠธ์— ๋‹ด์•„์ค€๋‹ค.
  6. ์œ„ ๊ณผ์ •์„ K ๋ฒˆ ์ˆ˜ํ–‰ํ•˜๊ณ  ๋‚จ์•„์žˆ๋Š” ํŒŒ์ด์–ด๋ณผ์˜ ์งˆ๋Ÿ‰์˜ ํ•ฉ์„ ๊ตฌํ•ด์ฃผ๋ฉด ๋œ๋‹ค.
  7. ๊ฐœ์ธ์ ์œผ๋กœ๋Š” ์ƒ๊ฐ๋ณด๋‹ค ๊ตฌํ˜„์ด ๊นŒ๋‹ค๋กญ๊ณ  ์‹ ๊ฒฝ ์“ธ ๊ฒŒ ๋งŽ์•„์•ผ ํ–ˆ๋˜ ๋ฌธ์ œ์˜€๋‹ค.

<์ •๋‹ต ์ฝ”๋“œ>

import sys, os, io, atexit

input = lambda: sys.stdin.readline().rstrip('\r\n')
stdout = io.BytesIO()
sys.stdout.write = lambda s: stdout.write(s.encode("ascii"))
atexit.register(lambda: os.write(1, stdout.getvalue()))

# 220921 20056 ๋งˆ๋ฒ•์‚ฌ ์ƒ์–ด์™€ ํŒŒ์ด์–ด๋ณผ

# ์ •๋‹ต์ฝ”๋“œ

# N: ๋ฐฐ์—ด ํฌ๊ธฐ, M: ํŒŒ์ด์–ด๋ณผ ๊ฐœ์ˆ˜, K: ์ด๋™ ํšŒ์ˆ˜
N, M, K = map(int, input().split())

# fireball: ํŒŒ์ด์–ด๋ณผ ๋ฆฌ์ŠคํŠธ
fireball = []
for _ in range(M):
    temp = list(map(int, input().split()))
    # 0_index๋กœ ์ €์žฅ
    temp[0] -= 1
    temp[1] -= 1
    fireball.append(temp)

# arr: ํŒŒ์ด์–ด๋ณผ์ด ์œ„์น˜ํ•˜๋Š” ๋ฐฐ์—ด
arr = [[[] for _ in range(N)] for _ in range(N)]

# direction: ์œ„์น˜ ์ •๋ณด
direction = {
    0 : (-1, 0),
    1 : (-1, 1),
    2 : (0, 1),
    3 : (1, 1),
    4 : (1, 0),
    5 : (1, -1),
    6 : (0, -1),
    7 : (-1, -1),
}


# move: ํŒŒ์ด์–ด๋ณผ์˜ ์ด๋™
def move():

    # ๋ฆฌ์ŠคํŠธ์—์„œ ํŒŒ์ด์–ด๋ณผ์„ ํ•˜๋‚˜์”ฉ ๊บผ๋‚ด์„œ ๋ฐฐ์—ด์— ์ด๋™ ์œ„์น˜๋ฅผ ํ‘œ์‹œํ•ด์ค€๋‹ค.
    while fireball:
        fireball_info = fireball.pop()

        # ํŒŒ์ด์–ด๋ณผ ์ด๋™
        fireball_info[0] = (fireball_info[0] + (fireball_info[3] * direction[fireball_info[4]][0])) % N
        fireball_info[1] = (fireball_info[1] + (fireball_info[3] * direction[fireball_info[4]][1])) % N

        # ๋ฒ ์—ด์— ํŒŒ์ด์–ด๋ณผ ํ‘œ์‹œ
        arr[fireball_info[0]][fireball_info[1]].append([fireball_info[2], fireball_info[3], fireball_info[4]])

    return 


# merge_split: ํŒŒ์ด์–ด๋ณผ์ด ํ•ฉ์ณ์กŒ๋‹ค๊ฐ€ ๋‚˜๋‰˜์–ด์ง€๋Š” ํ•จ์ˆ˜
def merge_split():
    for r in range(N):
        for c in range(N):

            # ๋ฐฐ์—ด์˜ ๋™์ผํ•œ ์œ„์น˜์— ํŒŒ์ด์–ด๋ณผ์ด ๋‘ ๊ฐœ ์ด์ƒ์ธ ๊ฒฝ์šฐ
            if len(arr[r][c]) > 1:

                # nm, ns: ๋‚˜๋‰˜์–ด์ง„ ํŒŒ์ด์–ด๋ณผ์˜ ์งˆ๋Ÿ‰๊ณผ ์†๋„
                nm = 0
                ns = 0
                # even, odd: ํ•ฉ์ณ์ง€๋Š” ํŒŒ์ด์–ด๋ณผ์˜ ๋ฐฉํ–ฅ์„ ์„ธ๋Š” ๋ณ€์ˆ˜
                even = 0
                odd = 0
                # cnt: ํ•ฉ์ณ์ง€๋Š” ํŒŒ์ด์–ด๋ณผ์˜ ๊ฐœ์ˆ˜
                cnt = len(arr[r][c])

                while arr[r][c]:
                    # ํŒŒ์ด์–ด๋ณผ์˜ ์งˆ๋Ÿ‰๊ณผ ์†๋„๋ฅผ ๋”ํ•ด์ค€๋‹ค.
                    m, s, d = arr[r][c].pop()
                    nm += m
                    ns += s
                    # ํŒŒ์ด์–ด ๋ณผ์˜ ๋ฐฉํ–ฅ์„ ์„ธ์ค€๋‹ค.
                    if d % 2:
                        odd += 1
                    else:
                        even += 1

                # ํŒŒ์ด์–ด๋ณผ์˜ ์งˆ๋Ÿ‰์ด ๋‚จ์•„์žˆ๋Š” ๊ฒฝ์šฐ
                if nm//5:
                    # ๋ชจ๋‘ ํ™€์ˆ˜์ด๊ฑฐ๋‚˜ ์ง์ˆ˜์ธ ๊ฒฝ์šฐ
                    if cnt == odd or cnt == even:
                        fireball.append([r, c, nm//5, ns//cnt, 0])
                        fireball.append([r, c, nm//5, ns//cnt, 2])
                        fireball.append([r, c, nm//5, ns//cnt, 4])
                        fireball.append([r, c, nm//5, ns//cnt, 6])
                    # ๋‹ค๋ฅธ ๋ฐฉํ–ฅ์ด ์žˆ๋Š” ๊ฒฝ์šฐ
                    else:
                        fireball.append([r, c, nm//5, ns//cnt, 1])
                        fireball.append([r, c, nm//5, ns//cnt, 3])
                        fireball.append([r, c, nm//5, ns//cnt, 5])
                        fireball.append([r, c, nm//5, ns//cnt, 7])

            # ๋ฐฐ์—ด์˜ ์œ„์น˜์— ํŒŒ์ด์–ด๋ณผ์ด ํ•˜๋‚˜๋งŒ ์กด์žฌํ•˜๋Š” ๊ฒฝ์šฐ ๊ทธ๋Œ€๋กœ ํŒŒ์ด์–ด๋ณผ ๋ฆฌ์ŠคํŠธ์— ๋‹ค์‹œ ๋„ฃ์–ด์ค€๋‹ค.
            elif len(arr[r][c]) == 1:
                fireball.append([r, c] + arr[r][c].pop())


# ์‹œํ–‰์„ K๋ฒˆ ๋ฐ˜๋ณตํ•œ๋‹ค.
for _ in range(K):
    move()
    merge_split()

# ans: ๋‚จ์•„์žˆ๋Š” ํŒŒ์ด์–ด๋ณผ ์งˆ๋Ÿ‰์˜ ํ•ฉ
ans = 0

# ๋‚จ์•„์žˆ๋Š” ํŒŒ์ด์–ด๋ณผ ์งˆ๋Ÿ‰์˜ ํ•ฉ์„ ๋”ํ•ด์ค€๋‹ค.
for i in range(len(fireball)):
    ans += fireball[i][2]

# ์ •๋‹ต ์ถœ๋ ฅ
print(ans)

๋Œ“๊ธ€