백준 17822 원판 돌리기

wook2·2022년 1월 27일
0

알고리즘

목록 보기
54/117

처음 문제 설명은 어려워보이게 생겼는데 읽어보면 배열에서 주변 숫자가 같은 것 끼리 지우면 된다.
크게 두가지를 실행하면 되는데,
배열 돌리는 함수와 지우는 함수가 필요하다.
파이썬에서 배열을 쉽게 돌리는 방법은 deque라이브러리의 rotate함수를 사용해 배열을 돌릴 수 있다.
두번째로 지우는 함수를 구상할때, 처음에는 일단 같은 쌍을 찾아야겠다고 생각했었고, 만약 같은 쌍을 찾았을때 바로 update를 한다면 다른 인접한 숫자가 지워지지 않는 경우도 있을 수 있겠다고 생각했다.
그렇기 때문에 같은 모든 쌍을 모두 찾은 후 한번에 지워야 된다는 것을 알고, 같은 쌍을 모두 찾은다음에 한꺼번에 업데이트를 해주었다.

from collections import deque
n,m,t = list(map(int,input().split()))
numbers = []
numbers.append([0])
for i in range(n):
    tmp = list(map(int,input().split()))
    queue = deque(tmp)
    numbers.append(queue)
rt = []
for i in range(t):
    rt.append(list(map(int,input().split())))
def rotate(idx,d,k): ## d 방향으로 k번 옮기는 함수
    for i in range(1,n+1):
        if i % idx == 0: ## i 배수인 원판에 대하여
            if d == 0: ## 시계방향 인 경우 뒤에 있는거 앞으로
                for j in range(k):
                    numbers[i].rotate(1)
            else:
                for j in range(k):
                    numbers[i].rotate(-1)

def remove():
    ## 같은 행끼리 확인
    erase_list = []
    for i in range(1,n+1):
        for j in range(m):
            if j == m-1: ## 같은 행 오른쪽 비교
                if numbers[i][j] != 'x' and numbers[i][j] == numbers[i][0]:
                    erase_list.append((i,j))
                    erase_list.append((i,0))
            else:
                if numbers[i][j] != 'x' and numbers[i][j] == numbers[i][j+1]:
                    erase_list.append((i,j))
                    erase_list.append((i,j+1))
            if i != n and numbers[i][j] != 'x' and numbers[i][j] == numbers[i+1][j]:
                erase_list.append((i, j))
                erase_list.append((i + 1, j))

    erase_list = list(set(erase_list))

    tmp = 0
    k = 0
    if len(erase_list) == 0: ## 인접한것 없다면
        for i in range(1,n+1):
            for j in range(m):
                if numbers[i][j] != 'x':
                    tmp += numbers[i][j]
                    k += 1
        for i in range(1,n+1):
            for j in range(m):
                if numbers[i][j] != 'x':
                    if numbers[i][j] > tmp/k:
                        numbers[i][j] -= 1
                    elif numbers[i][j] < tmp/k:
                        numbers[i][j] += 1
    else:
        for pair in erase_list:
            x,y = pair
            numbers[x][y] = 'x'
# print(numbers)
for r in rt:
    x,d,k = r
    rotate(x,d,k)
    remove()

ans = 0
for i in range(1,n+1):
    for j in range(m):
        if numbers[i][j] != 'x':
            ans += numbers[i][j]
print(ans)
# print(numbers)

profile
꾸준히 공부하자

0개의 댓글