알고리즘/백준
[Python] 백준 17822: 원판 돌리기
juhi
2021. 4. 16. 22:50
17822번: 원판 돌리기
반지름이 1, 2, ..., N인 원판이 크기가 작아지는 순으로 바닥에 놓여있고, 원판의 중심은 모두 같다. 원판의 반지름이 i이면, 그 원판을 i번째 원판이라고 한다. 각각의 원판에는 M개의 정수가 적혀
www.acmicpc.net
풀이 과정
- 구현해야 하는 기능은 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)
반응형