코딩테스트/구현

원판 돌리기

수타. 2023. 7. 31. 21:24

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

 

17822번: 원판 돌리기

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

www.acmicpc.net

문제요약:

원판이 주어지고 x,d,k가 t번 주어질 때, x의 배수원판을 d방향으로 k번 회전시킨후,

원판에 수가 남아있을때, 인접한같은수가 있으면 모두지우고, 없다면 평균에서 작은것들은 1더하고 큰것들은 1을 뺀다.

 

소요시간:

1시간 30분

 

난이도:

골드2

 

제출 횟수:

1회

 

코딩:

import sys
input = sys.stdin.readline
from collections import deque

n,m,t = map(int,input().split())

arr=  [deque((map(int,input().split()))) for _ in range(n)]

for _ in range(t):
    x,d,k = map(int,input().split())
    if d:
        p = -1
    else:
        p = 1
    #배수들 회전
    for b in range(x,n+1,x):
        for _ in range(k):     
            arr[b-1].rotate(p)

    #같은 수 찾기
    temp = [[0]*m for _ in range(n)]
    piv = 0
    
    for y in range(n):
        for x in range(-1,m):
            #근처에 같은게 있으면 표시
            if arr[y][x] !=0 and y !=n-1 and arr[y][x] == arr[y+1][x]:
                temp[y][x] = temp[y+1][x] = 1
                piv = 1
            if arr[y][x] !=0 and x != m-1 and arr[y][x] == arr[y][x+1]:
                temp[y][x] = temp[y][x+1] = 1
                piv = 1
    ave = 0
    num = 0
    for y in range(n):
        for x in range(m):
            #같은게 있었으면
            if piv:
                if temp[y][x] :
                    arr[y][x] = 0
            #같은게 없었으면
            else:
                if arr[y][x] :
                    num+=1
                    ave+=arr[y][x] 
    #평균보다클때 작을때
    if not piv:
        for y in range(n):
            for x in range(m):
                if arr[y][x] !=0 :
                    if arr[y][x] == (ave/num):
                        continue
                    elif arr[y][x] > (ave/num):
                        arr[y][x] -=1
                    else:
                        arr[y][x] +=1

print(sum([j for i in arr for j in i]))

사실 문제를 읽자마자, 2차원 배열을 하되, 각행들이 deque로 한뒤 rotate함수를 쓰면 되겠다고 생각했는데, 컨디션이 좋지않아 단순한 구현실수들이 많아 구현시간이 오래 걸렸습니다. 각각 다음 수와 같은지 확인할 때, 원판의 맨끝과 처음이 같아도 같은것이기 때문에, x는 -1부터 순환 시켰습니다.(-1이면 배열의 끝 거기에 +1 하면 0이니까 왼쪽끝이기 때문에 비교가능)