본문 바로가기

알고리즘/백준

[Python] 백준 17822: 원판 돌리기

www.acmicpc.net/problem/17822

 

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)
반응형