원판돌리기 파이썬 백준 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)
회고
문제를 잘읽어보고 풀자. 문제에 적혀있는데 안읽고 틀려버림..
Author And Source
이 문제에 관하여(원판돌리기 파이썬 백준 17822), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@ifelifelse/원판돌리기-파이썬-백준-17822저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)