티스토리 뷰

PS

[Python] 백준_원판 돌리기(17822)

희철 2023. 3. 24. 14:45

문제

 

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

 

17822번: 원판 돌리기

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

www.acmicpc.net

 

 

풀이

 

원판을 반시계방향으로 회전하는 것은 배열의 맨 앞 원소를 맨 뒤에 보내면되고, 시계방향으로 회전하는 것은 맨 뒤의 원소를 맨 앞에 보내면됨.

 

원판을 회전시킨 이후에 인접한 원소를 확인해야하므로 DFS를 이용하였음.

check 메서드에서 temp변수는 원판에서 지워진 원소가 있는지 확인하는 변수고, temp_check는 0이 아닌 원소를 시작으로 인접한 원소들을 확인할때 인접한 원소가 있는지를 확인하는 변수임.

만약 0이 아닌 원소를 미리 바꿔두고 DFS를 진행하면 인접한 원소가 없을 때 다시 기존값으로 바꿔줘야하기때문에 temp_check를 이용하였음.

 

인접한 원소가 없는 경우에는 평균을 계산해서 각 원소에 1을 더하거나 빼야하는데, 0으로 나누지않도록 주의해야함.

n,m,t = map(int,input().split())
board = []
ad = [(0,1),(0,-1),(1,0),(-1,0)]
def rotate(i,d,k):
    global board
    if d == 0:
        for _ in range(k):
            board[i] = [board[i][-1]] + board[i][:m - 1]
    else:
        for _ in range(k):
            board[i] = board[i][1:] + [board[i][0]]
def check():
    global board
    temp = False
    for i in range(n):
        for j in range(m):
            if board[i][j] != 0:
                num = board[i][j]
                temp_check = False
                queue = [(i,j)]
                while queue:
                    cur = queue.pop()
                    for k in range(4):
                        nx = cur[0] + ad[k][0]
                        ny = cur[1] + ad[k][1]
                        if nx < 0 or nx >= n:
                            continue
                        if ny < 0:
                            ny += m
                        if ny >= m:
                            ny -= m
                        if board[nx][ny] == num:
                            queue.append((nx,ny))
                            temp = True
                            temp_check = True
                            board[nx][ny] = 0
                if temp_check:
                    board[i][j] = 0
    if temp:
        return
    avg = 0
    count = 0
    for i in range(n):
        for j in range(m):
            avg += board[i][j]
            if board[i][j] != 0:
                count += 1
    if count == 0:
        return
    avg /= count
    for i in range(n):
        for j in range(m):
            if board[i][j] != 0:
                if board[i][j] > avg:
                    board[i][j] -= 1
                elif board[i][j] < avg:
                    board[i][j] += 1
for _ in range(n):
    board.append(list(map(int,input().split())))
for _ in range(t):
    x,d,k = map(int,input().split())
    for i in range(n):
        if (i + 1) % x == 0:
            rotate(i,d,k)
    check()
result = 0
for i in range(n):
    for j in range(m):
        result += board[i][j]
print(result)

 

 

_____________________________________________________________________________________________________

 

원판이 독립적이라길래 각 원판별로 지워진 원소가 없으면 평균을 구해서 더하거나 빼는 건줄 알았는데 아니었음. 문제를 잘못이해하는 경우가 너무많음..제대로 읽기

댓글
최근에 올라온 글
Total
Today
Yesterday