ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [백준] 17822 - 원판 돌리기 (파이썬)
    알고리즘/백준 2021. 9. 28. 18:06
    import sys
    sys.setrecursionlimit(10**5)
    n,m,t = map(int,input().split())
    circle = []
    for _ in range(n):
        circle.append(list(map(int,input().split())))
    circle.append([0 for _ in range(m)])
    def rt(idx,d,x):
        if d == 0:
            for _ in range(x):
                last = circle[idx][-1]
                for i in range(m-1,0,-1):
                    circle[idx][i] = circle[idx][i-1]
                circle[idx][0] = last
        elif d == 1:
            for _ in range(x):
                last = circle[idx][0]
                for i in range(m-1):
                    circle[idx][i] = circle[idx][i+1]
                circle[idx][-1] = last
    
    def DFS(v,idx,target):
        if v==n-1:
            if idx == 0:
                if circle[v][m-1] == target:
                    circle[v][m-1] = 0
                    DFS(v,m-1,target)
                if circle[v][idx+1] == target:
                    circle[v][idx+1] = 0
                    DFS(v,idx+1,target)
            elif idx == m-1:
                if circle[v][0] == target:
                    circle[v][0] = 0
                    DFS(v,0,target)
                if circle[v][m-2] == target:
                    circle[v][m-2] = 0
                    DFS(v,m-2,target)
            else:
                if circle[v][idx+1] == target:
                    circle[v][idx+1] = 0
                    DFS(v,idx+1,target)
                if circle[v][idx-1] == target:
                    circle[v][idx-1] = 0
                    DFS(v,idx-1,target) 
        elif v==0:
            if idx == 0:
                if circle[v][m-1] == target:
                    circle[v][m-1] = 0
                    DFS(v,m-1,target)
                    if circle[v+1][m-1] == target:
                        circle[v+1][m-1] = 0
                        DFS(v+1,m-1,target)
                if circle[v][1] == target:
                    circle[v][1] = 0
                    DFS(v,1,target)
                    if circle[v+1][1] == target:
                        circle[v+1][1] = 0
                        DFS(v+1,1,target)
                if circle[v+1][idx] == target:
                    circle[v+1][idx] = 0
                    DFS(v+1,idx,target)
            elif idx == m-1:
                if circle[v][0] == target:
                    circle[v][0] = 0
                    DFS(v,0,target)
                    if circle[v+1][0] == target:
                        circle[v+1][0] = 0
                        DFS(v+1,0,target)
                if circle[v][m-2] == target:
                    circle[v][m-2] = 0
                    DFS(v,m-2,target)
                    if circle[v+1][m-2] == target:
                        circle[v+1][m-2] = 0
                        DFS(v+1,m-2,target)
                if circle[v+1][idx] == target:
                    circle[v+1][idx] = 0
                    DFS(v+1,idx,target)
            else:
                if circle[v][idx-1] == target:
                    circle[v][idx-1] = 0
                    DFS(v,idx-1,target)
                    if circle[v+1][idx-1] == target:
                        circle[v+1][idx-1] = 0
                        DFS(v+1,idx-1,target)
                if circle[v][idx+1] == target:
                    circle[v][idx+1] = 0
                    DFS(v,idx+1,target)
                    if circle[v+1][idx+1] == target:
                        circle[v+1][idx+1] = 0
                        DFS(v+1,idx+1,target)
                if circle[v+1][idx] == target:
                    circle[v+1][idx] = 0
                    DFS(v+1,idx,target)
        else:
            if idx == 0:
                if circle[v][m-1] == target:
                    circle[v][m-1] = 0
                    DFS(v,m-1,target)
                    if circle[v+1][m-1] == target:
                        circle[v+1][m-1] = 0
                        DFS(v+1,m-1,target)
                    if circle[v-1][m-1] == target:
                        circle[v-1][m-1] = 0
                        DFS(v-1,m-1,target)
                if circle[v][1] == target:
                    circle[v][1] = 0
                    DFS(v,1,target)
                    if circle[v+1][1] == target:
                        circle[v+1][1] = 0
                        DFS(v+1,1,target)
                    if circle[v-1][1] == target:
                        circle[v-1][1] = 0
                        DFS(v-1,1,target)
                if circle[v+1][idx] == target:
                    circle[v+1][idx] = 0
                    DFS(v+1,idx,target)
                if circle[v-1][idx] == target:
                    circle[v-1][idx] = 0
                    DFS(v-1,idx,target)
            elif idx == m-1:
                if circle[v][0] == target:
                    circle[v][0] = 0
                    DFS(v,0,target)
                    if circle[v+1][0] == target:
                        circle[v+1][0] = 0
                        DFS(v+1,0,target)
                    if circle[v-1][0] == target:
                        circle[v-1][0] = 0
                        DFS(v-1,0,target)
                if circle[v][m-2] == target:
                    circle[v][m-2] = 0
                    DFS(v,m-2,target)
                    if circle[v+1][m-2] == target:
                        circle[v+1][m-2] = 0
                        DFS(v+1,m-2,target)
                    if circle[v-1][m-2] == target:
                        circle[v-1][m-2] = 0
                        DFS(v-1,m-2,target)
                if circle[v+1][idx] == target:
                    circle[v+1][idx] = 0
                    DFS(v+1,idx,target)
                if circle[v-1][idx] == target:
                    circle[v-1][idx] = 0
                    DFS(v-1,idx,target)
            else:
                if circle[v][idx-1] == target:
                    circle[v][idx-1] = 0
                    DFS(v,idx-1,target)
                    if circle[v+1][idx-1] == target:
                        circle[v+1][idx-1] = 0
                        DFS(v+1,idx-1,target)
                    if circle[v-1][idx-1] == target:
                        circle[v-1][idx-1] = 0
                        DFS(v-1,idx-1,target)
                if circle[v][idx+1] == target:
                    circle[v][idx+1] = 0
                    DFS(v,idx+1,target)
                    if circle[v+1][idx+1] == target:
                        circle[v+1][idx+1] = 0
                        DFS(v+1,idx+1,target)
                    if circle[v-1][idx+1] == target:
                        circle[v-1][idx+1] = 0
                        DFS(v-1,idx+1,target)
                if circle[v+1][idx] == target:
                    circle[v+1][idx] = 0
                    DFS(v+1,idx,target)
                if circle[v-1][idx] == target:
                    circle[v-1][idx] = 0
                    DFS(v-1,idx,target)
    for kk in range(t):
        
        idx, d, x = map(int,input().split())
        for i in range(idx,n+1,idx):
            rt(i-1,d,x)
       
        ttt = 0
        for i in range(n):
            for j in range(m):
                if circle[i][j] == 0:
                    continue
                if j == 0:
                    if circle[i][m-1] == circle[i][0] or circle[i][1] == circle[i][0] or circle[i+1][0] == circle[i][0]:
                        ttt = 1
                        k = circle[i][j]
                        circle[i][0] = 0
                        DFS(i,j,k)
                        
                elif j == m-1:
                    if circle[i][0] == circle[i][m-1] or circle[i][m-2] == circle[i][m-1] or circle[i+1][j] == circle[i][j]:
                        ttt = 1
                        k = circle[i][j]
                        circle[i][j] = 0
                        DFS(i,j,k)
                        
                else:
                    if circle[i][j-1] == circle[i][j] or circle[i][j+1] == circle[i][j] or circle[i+1][j] == circle[i][j]:
                        ttt = 1
                        k = circle[i][j]
                        circle[i][j] = 0
                        DFS(i,j,k)
                        
        if ttt == 0:
            count = 0
            sm = 0
            for i in range(n):
                for j in range(m):
                    if circle[i][j] != 0:
                        count += 1
                        sm += circle[i][j]
            if count == 0:
                av = 0
            else:
                av = sm/count
            for i in range(n):
                for j in range(m):
                    if circle[i][j] != 0:
                        if circle[i][j] > av:
                            circle[i][j] -= 1
                        elif circle[i][j] < av:
                            circle[i][j] += 1
    sm = 0
    for i in range(n):
        for j in range(m):
            sm += circle[i][j]
    
    print(sm)

    진짜 멍청하게 DFS로 풀어서 230줄.. 생각을 더욱 오래하고 시작하는게 좋을 것 같다.

    댓글

Designed by Tistory.