풀이 과정
- 구현해야 하는 기능은 3가지 이다.
- 1 - 시계방향/반시계 방향으로 회전
- 2 - 인접한 같은 것을 찾아서 지우기
- 3 - 2에서 지울 값이 없다면 평균을 구하고 평균보다 큰 값엔 -1, 작은 값엔 +1 해주기
- 2번은 bfs/dfs로도 구할 수 있는데 그냥 이중배열로 구하는게 더 쉽다.
- 처음에 2번을 구혈할 때 인접 행 찾아서 지우고, 인접 열 찾아서 지웠다. 이렇게 하니까 행 찾을 때 지운 결과에 대해서 인접 열을 찾게돼서 틀렸다. -> 인접 행 찾아서 바로 지우지 않고 다른 변수에 값을 저장하고 마지막에 비교, 배정해준다. (remove함수에서 board와 temp)
전체 코드
from copy import deepcopy
def rotate(x, d, k):
for i in range(x-1, n, x):
temp = [0]*m
if d == 0:
for j in range(m):
temp[j] = board[i][(j-k+m)%m]
else:
for j in range(m):
temp[j] = board[i][(j+k+m)%m]
board[i] = temp
def remove():
global board
temp = deepcopy(board)
for i in range(n):
for j in range(m):
if board[i][j] == -1: continue
if board[i][(j - 1 + m) % m] == board[i][j]:
temp[i][j] = -1
temp[i][(j - 1 + m) % m] = -1
if board[i][(j + 1 + m) % m] == board[i][j]:
temp[i][j] = -1
temp[i][(j + 1 + m) % m] = -1
for j in range(m):
for i in range(1, n):
if board[i][j] == -1: continue
if board[i-1][j] == board[i][j]:
temp[i][j] = -1
temp[i-1][j] = -1
if board == temp:
return False
board = temp
return True
def chageWithAvg():
avg = 0
cnt = 0
for i in range(n):
for j in range(m):
if board[i][j] != -1:
avg += board[i][j]
cnt += 1
if cnt == 0: return
avg /= cnt
for i in range(n):
for j in range(m):
if board[i][j] == -1: continue
if board[i][j] > avg:
board[i][j] -= 1
elif board[i][j] < avg:
board[i][j] += 1
n, m, t = map(int, input().split())
board = []
for i in range(n):
board.append(list(map(int, input().split())))
for i in range(t):
x, d, k = map(int, input().split())
rotate(x, d, k)
check = remove()
if not check:
chageWithAvg()
answer = 0
for i in range(n):
for j in range(m):
if board[i][j] != -1:
answer += board[i][j]
print(answer)
반응형
'알고리즘 > 백준' 카테고리의 다른 글
[Python] 백준 20057: 마법사 상어와 토네이도 (2) | 2021.04.18 |
---|---|
[Python] 백준 17825: 주사위 윷놀이 (2) | 2021.04.17 |
[Python] 백준 17779: 게리맨더링 2 (0) | 2021.04.16 |
[Python] 백준 17837 : 새로운 게임 2 (0) | 2021.04.16 |
[Python] 백준 17142 : 연구소 3 (0) | 2021.04.15 |