ν‹°μŠ€ν† λ¦¬ λ·°

728x90
λ°˜μ‘ν˜•

문제

 

17822번: μ›νŒ 돌리기

λ°˜μ§€λ¦„μ΄ 1, 2, ..., N인 μ›νŒμ΄ 크기가 μž‘μ•„μ§€λŠ” 순으둜 λ°”λ‹₯에 λ†“μ—¬μžˆκ³ , μ›νŒμ˜ 쀑심은 λͺ¨λ‘ κ°™λ‹€. μ›νŒμ˜ λ°˜μ§€λ¦„μ΄ i이면, κ·Έ μ›νŒμ„ i번째 μ›νŒμ΄λΌκ³  ν•œλ‹€. 각각의 μ›νŒμ—λŠ” M개의 μ •μˆ˜κ°€ μ ν˜€

www.acmicpc.net

 

문제 풀이

 μ›νŒμ΄ μ£Όμ–΄μ§ˆ λ•Œ, μ›νŒμ€ μ„œλ‘œ 겹쳐져 μžˆλ‹€. μ΄λ•Œ, μ›νŒμ„ λͺ…λ Ήμ–΄ λ•ŒλΌ νšŒμ „ν•˜κ³  μΈμ ‘ν•œ μˆ˜κ°€ 같은 수인 경우 μ œκ±°ν•˜λŠ” 방식을 μ·¨ν•œλ‹€. κ·Έ ν›„, λͺ…령을 μˆ˜ν–‰ ν›„ μ΅œμ’…μ μœΌλ‘œ μ›νŒμ— 남은 수λ₯Ό ν•©ν•˜μ—¬ 좜λ ₯ν•˜λ©΄ 문제의 닡을 찾을 수 μžˆλ‹€.

 

 λ¬Έμ œλ₯Ό ν’€λ©΄μ„œ μ£Όμ˜ν•  점은 λ‹€μŒκ³Ό κ°™λ‹€. μΈμ ‘ν•œ 수λ₯Ό μ œκ±°ν•˜λ©΄ 되고, 예제만 보고 λ‚˜μ„œ λŒ€μΆ© ν’€μ–΄μ„œ μ΄μƒν•œ κ³³μ—μ„œ 또 헀맀닀가 μ‹œκ°„μ„ λ³΄λƒˆλ‹€.

  1. x, d, kκ°€ 주어지면 μ›νŒ 쀑 x의 배수인 경우 λ‹€ 같이 νšŒμ „ν•œλ‹€.
  2. μΈμ ‘ν•œ μˆ˜κ°€ ν•˜λ‚˜λ„ μ—†λŠ” 경우, ν˜„μž¬ μ›νŒμ— 적힌 수의 평균보닀 μž‘μ€ 경우 1을 λ”ν•˜κ³  큰 경우 1을 λΊ€λ‹€.
    • `q[r][c] += 1 if q[r][c] < avg else -1`κ³Ό 같이 μ΅œμ΄ˆμ— μ½”λ“œλ₯Ό μž‘μ„±ν•˜μ˜€λ‹€.
    • μ΄λŠ” λ°˜λŒ€μ˜ 경우 `>=` 이기에, 예제 μž…λ ₯ 5μ—μ„œ μ˜€λ‹΅μ„ 좜λ ₯ν•˜κ²Œ λœλ‹€.

 λ‚˜λ¨Έμ§€λŠ” λ¬Έμ œμ— 주어진 쑰건 λŒ€λ‘œ κ·ΈλŒ€λ‘œ κ΅¬ν˜„ν•˜λ©΄, μ‰½κ²Œ 닡을 ꡬ할 수 μžˆλ‹€. μ›νŒμ„ νšŒμ „μ‹œν‚€κΈ° μœ„ν•΄μ„œλŠ” `deque`의 `rotate`λ₯Ό ν™œμš©ν•˜μ˜€λ‹€. μ‹œκ³„ λ°©ν–₯(Clockwise)은 1 * K만큼 rotate ν•˜κ³ , λ°˜μ‹œκ³„ λ°©ν–₯(Anti-Clockwise)은 -1 * K 만큼 rotate ν•˜λ©΄ λœλ‹€.

 

μ½”λ“œ

from sys import stdin
from collections import deque


def del_adj_nums():
    for x, d, k in query:
        for i in range(N):
            # x의 λ°°μˆ˜κ°€ λ˜λŠ” μ›νŒμ„ νšŒμ „
            if (i + 1) % x == 0:
                q[i].rotate(change_dir[d] * k)

        temp = []
        # λ‹€λ₯Έ μ›νŒμ˜ μΈμ ‘ν•œ 숫자 체크
        for r in range(N - 1):
            for c in range(M):
                if q[r][c] == q[r + 1][c] and q[r][c]:
                    temp += ([r, c], [r + 1, c])
        # 같은 μ›νŒμ— μΈμ ‘ν•œ 숫자 체크
        for r in range(N):
            for c in range(M):
                if q[r][c - 1] == q[r][c] and q[r][c - 1]:
                    temp += ([r, c - 1], [r, c])
        
        # μΈμ ‘ν•œ 것 쀑 λ™μΌν•œ 숫자λ₯Ό λͺ¨λ‘ 0으둜 λ§Œλ“¦
        for r, c in temp:
            q[r][c] = 0

        # νšŒμ „ ν›„ μΈμ ‘ν•˜λŠ” 것이 μ—†λŠ” 경우, 평균에 따라 값을 λ³€ν™” μ‹œν‚΄
        if not temp:
            zero_cnt = sum([q[i].count(0) for i in range(N)])
            cnt = N * M - zero_cnt
            cur_sum = sum(sum(q, deque()))
            if not cnt:
                continue

            avg = cur_sum / cnt
            for r in range(N):
                for c in range(M):
                    if not q[r][c]:
                        continue

                    if q[r][c] > avg:
                        q[r][c] -= 1
                    elif q[r][c] < avg:
                        q[r][c] += 1


if __name__ == '__main__':
    change_dir = {0: 1, 1: -1}
    N, M, T = map(int, input().split())
    q = deque()
    for _ in range(N):
        q.append(deque(map(int, input().split())))

    query = [list(map(int, stdin.readline().split())) for _ in range(T)]

    del_adj_nums()
    print(sum(sum(q, deque())))

 

728x90
λ°˜μ‘ν˜•
λŒ“κΈ€
κΈ€ 보관함
μ΅œκ·Όμ— 올라온 κΈ€
μ΅œκ·Όμ— 달린 λŒ“κΈ€