https://www.acmicpc.net/problem/17822

 

17822번: 원판 돌리기

반지름이 1, 2, ..., N인 원판이 크기가 작아지는 순으로 바닥에 놓여있고, 원판의 중심은 모두 같다. 원판의 반지름이 i이면, 그 원판을 i번째 원판이라고 한다. 각각의 원판에는 M개의 정수가 적혀

www.acmicpc.net

접근

별다른 알고리즘이 필요하지 않은 단순 구현 문제였다.

코드

N, M, T = map(int, input().split())
board = [list(map(int, input().split())) for _ in range(N)]


def rotate(x, d, k):
    i = 1
    cnt = x - 1
    while cnt < N:
        for _ in range(k):
            if d == 0:
                board[cnt] = [board[cnt][-1]] + board[cnt][:-1]
            elif d == 1:
                board[cnt] = board[cnt][1:] + [board[cnt][0]]
        i += 1
        cnt = x * i - 1


def delete():
    delete_list = set([])
    total = 0
    cnt = 0
    for i in range(N - 1):
        for j in range(M):
            ij, ij1, ij2 = board[i][j], board[i][(j + 1) % M], board[i + 1][j]
            if ij:
                total += ij
                cnt += 1
                if ij == ij1:
                    delete_list.add((i, j))
                    delete_list.add((i, (j + 1) % M))
                if ij == ij2:
                    delete_list.add((i, j))
                    delete_list.add((i + 1, j))
    for j in range(M):
        ij, ij1 = board[N - 1][j], board[N - 1][(j + 1) % M]
        if ij:
            total += ij
            cnt += 1
            if ij == ij1:
                delete_list.add((N - 1, j))
                delete_list.add((N - 1, (j + 1) % M))
    if delete_list:
        for i, j in delete_list:
            total -= board[i][j]
            board[i][j] = 0
            cnt -= 1
    elif cnt == 0:
        return 0
    else:
        average = total / cnt
        for i in range(N):
            for j in range(M):
                if board[i][j]:
                    if board[i][j] < average:
                        board[i][j] += 1
                        total += 1
                    elif average < board[i][j]:
                        board[i][j] -= 1
                        total -= 1
    return total


for _ in range(T):
    x, d, k = map(int, input().split())
    rotate(x, d, k)
    res = delete()
print(res)

더 생각해 볼 것?

...

코드나 내용 관련 조언, 부족한 점 및 질문 언제든 환영합니다!

반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기