17822 - 원판 돌리기

2022. 5. 3. 14:052022/BaekJoon_삼성 SW 역량 테스트 기출

N, M, T = map(int, input().split())
graph = []; xdk = []
for _ in range(N):
    graph.append(list(map(int, input().split())))

for _ in range(T):
    xdk.append(list(map(int, input().split())))
    
result = 0;
for n in range(T):
    x = xdk[n][0]; d = xdk[n][1]; k = xdk[n][2]
    # k번 회전
    for i in range(N):
        if (i+1)%x == 0:
            if d == 0:
                for _ in range(k):
                    graph[i].insert(0, graph[i].pop(-1))
            elif d == 1:
                for _ in range(k):
                    graph[i].append(graph[i].pop(0))
                
    # 인접한 같은 수가 있는지 확인후 삭제
    avg = 0; nearSameNo = False; make0List = []
    for i in range(N):
        for j in range(M):
            # 원형이므로 한 행에서 처음과 끝은 붙어있다. -> 고려 OK
            # 첫 열과 끝 열은 인점하지 않았으므로 0과 -1인덱스의 값을 고려할 필요 없다.
            if graph[i][j] == 0:
                continue
                
            chkGraph = False

            left = j-1; right = j+1; up = i-1
            if right == M: right = 0
            if graph[i][j] == graph[i][left]:
                if [i, left] not in make0List:
                    make0List.append([i, left])
                chkGraph = True

            if graph[i][j] == graph[i][right]:
                if [i, right] not in make0List:
                    make0List.append([i, right])
                chkGraph = True

            if up != -1 and graph[i][j] == graph[up][j]:
                if [up, j] not in make0List:
                    make0List.append([up, j])
                chkGraph = True

            if chkGraph == True:
                make0List.append([i, j])
                nearSameNo = True

    for ij in make0List:
        i = ij[0]; j = ij[1]
        graph[i][j] = 0


    # 인접한 수가 없는 경우에는 평균보다 작은 수는 +1, 큰 수는 -1
    if nearSameNo == False:
        num = []
        for i in range(N):
            for j in range(M):
                if graph[i][j] != 0:
                    num.append(graph[i][j])
                    
        if  len(num) == 0:
            avg = 0
        else:
            avg = round(float(sum(num)/len(num)), 4)

        for i in range(N):
            for j in range(M):
                if graph[i][j] != 0 and graph[i][j] > avg:
                    graph[i][j]-=1
                elif graph[i][j] != 0 and graph[i][j] < avg:
                    graph[i][j]+=1
                
for i in range(N):
    result+=sum(graph[i])
            
print(result)