백준 17822 원판 돌리기

gmlwlswldbs·2021년 10월 18일
0

코딩테스트

목록 보기
55/130
n, m, t = map(int, input().split())
circle = [list(map(int, input().split())) for _ in range(n)]
x = [0] * t
d = [0] * t
k = [0] * t
di = [-1, 1, 0, 0]
dj = [0, 0, -1, 1]
for i in range(t):
    x[i], d[i], k[i] = map(int, input().split())

def rotate(circle, nx, nd, nk):
    for i in range(n):
        if (i + 1) % nx == 0:
            if nd == 0:
                nnd = 1
            else:
                nnd = -1
            tmp_row = [0] * m
            for j in range(0, len(circle[i])):
                tmp_row[(j+nk*nnd) % m] = circle[i][j]
            circle[i] = tmp_row
    return circle
def check(circle):
    circle_tmp = [[0] * m for _ in range(n)]
    for i in range(n):
        for j in range(m):
            circle_tmp[i][j] = circle[i][j]
    cnt = 0
    for i in range(n):
        for j in range(m):
            if circle[i][j] == 0:
                continue
            for k in range(4):
                if i + di[k] >= n or i + di[k] < 0:
                    continue
                ni, nj = (i + di[k])%n, (j + dj[k])%m
                if circle[ni][nj] == circle[i][j]:
                    cnt += 1
                    circle_tmp[ni][nj] = 0
                    circle_tmp[i][j] = 0

    if cnt == 0:
        csum = 0
        ccnt = 0
        for i in range(n):
            for j in range(m):
                if circle_tmp[i][j] != 0:
                    csum += circle_tmp[i][j]
                    ccnt += 1
        if ccnt != 0:
            csum /= ccnt
            for i in range(n):
                for j in range(m):
                    if circle_tmp[i][j] == 0:
                        continue
                    if circle_tmp[i][j] > csum:
                        circle_tmp[i][j] -= 1
                    elif circle_tmp[i][j] < csum:
                        circle_tmp[i][j] += 1
    return circle_tmp

time = 0
while True:
    if time == t:
        break
    circle = rotate(circle, x[time], d[time], k[time])
    circle = check(circle)
    time += 1

ans = 0
for i in range(n):
    ans += sum(circle[i])

print(ans)

바뀌면 안되는 것 구분!! 기준이 되는 것은 바뀌면 안됨 -> circle_tmp를 만들어줌
그리고 zero division 도 나누기 할 때는 꼭 생각해야됨...

0개의 댓글