원판돌리기 파이썬 백준 17822

문제

input

첫째 줄에 N, M, T이 주어진다.

둘째 줄부터 N개의 줄에 원판에 적힌 수가 주어진다. i번째 줄의 j번째 수는 (i, j)에 적힌 수를 의미한다.

다음 T개의 줄에 xi, di, ki가 주어진다.

output

원판을 T번 회전시킨 후 원판에 적힌 수의 합을 출력한다.

TODO

회전시키기 
같은숫자 
	있으면 제거하기
    없으면 
    	avg = 남은 숫자 합 / 남은 숫자 개수 
    	num < avg : num += 1
        num > avg : num -= 1

CODE

import sys 
from collections import deque 

def spin(arr,t,d):
    if d== 0:
        for _ in range(t):
            arr.appendleft(arr.pop())
    else : 
        for _ in range(t):
            arr.append(arr.popleft())

def check(board,n,m):
    temp_board = [deque([board[i][j] for j in range(m)]) for i in range(n)]
    dx = [0,1] 
    dy = [1,0]
    check = False 
    for i in range(n):
        for j in range(m): 
            for px, py in zip (dx,dy): 
                nx,ny = i+px, (j+py)%m
                if 0<=nx<n and 0<=ny<m and board[i][j] != 0 and board[i][j] == board[nx][ny] : 
                    temp_board[nx][ny] = 0
                    temp_board[i][j] = 0
                    check = True 
    if not check: 
        son = 0 
        mot = 0 
        for i in range(n):
            for j in range(m):
                son += board[i][j]
                if board[i][j] : 
                    mot+=1
        if mot == 0 : 
            return board, False 
        avg = son/mot
        for i in range(n):
            for j in range(m):
                if board[i][j] == 0 : 
                    continue 
                if board[i][j] < avg :
                    temp_board[i][j] += 1 
                elif board[i][j] > avg :
                    temp_board[i][j] -= 1
    return temp_board,True 

if __name__ == "__main__":
    n,m,t = map(int,sys.stdin.readline().split())
    board = [deque(list(map(int,sys.stdin.readline().split()))) for _ in range (n)] 
    command = [list(map(int,sys.stdin.readline().split())) for _ in range(t)]
    for comm in command :  
        #comm[0]의 배수 comm[1] 방향으로 comm[2]칸 회전 
        x,d,k = comm
        for i in range(x,n+1,x):
            spin(board[i-1],k,d)
        board,check_board = check(board,n,m)
        if not check_board : # 숫자가 다 사라짐 
            break 
    
    score =0 
    for b in board:
        score += sum(b)
    print(score)

회고

문제를 잘읽어보고 풀자. 문제에 적혀있는데 안읽고 틀려버림..

좋은 웹페이지 즐겨찾기