[Baekjoon] 배열 돌리기 6

Updated:

문제

크기가 2N×2N인 배열이 있을 때, 배열에 연산을 R번 적용하려고 한다. 연산은 8가지가 있고, 연산에는 단계 ℓ (0 ≤ ℓ < N)이 있다. 단계 ℓ은 배열을 부분 배열로 나눌때 사용하는 값이며, 부분 배열의 크기는 2ℓ×2ℓ가 되어야 한다. 단계는 연산을 수행할때마다 정한다.

다음은 크기가 23×23 배열을 단계 ℓ의 값에 따라 부분 배열로 나눈 것이다. 같은 부분 배열은 같은 색상으로 표시했다.

img img img
ℓ = 0 ℓ = 1 ℓ = 2

1번 연산은 각 부분 배열을 상하 반전시키는 연산이다.

img img
배열 ℓ = 1, 1번 연산 적용

2번 연산은 각 부분 배열을 좌우 반전시키는 연산이다.

img img
배열 ℓ = 2, 2번 연산 적용

3번 연산은 각 부분 배열을 오른쪽으로 90도 회전시키는 연산이다.

img img
배열 ℓ = 1, 3번 연산 적용

4번 연산은 각 부분 배열을 왼쪽으로 90도 회전시키는 연산이다.

img img
배열 ℓ = 2, 4번 연산 적용

5, 6, 7, 8번 연산은 부분 배열을 한 칸으로 생각하고 적용시킨다. 즉, 부분 배열의 안에 있는 값은 변하지 않는다.

5번 연산은 배열을 상하 반전시키는 연산이다.

img img
배열 ℓ = 2, 5번 연산 적용

6번 연산은 배열을 좌우 반전시키는 연산이다.

img img
배열 ℓ = 1, 6번 연산 적용

7번 연산은 오른쪽으로 90도 회전시키는 연산이다.

img img
배열 ℓ = 1, 7번 연산 적용

8번 연산은 왼쪽으로 90도 회전시키는 연산이다.

img img
배열 ℓ = 2, 8번 연산 적용

입력

첫째 줄에 N, R이 주어진다. 둘째 줄부터 2N개의 줄에 배열의 원소 A[i][j]가 주어진다. i번째 줄의 j번째 정수는 A[i][j]를 의미한다.

다음 R개의 줄에 배열에 적용시켜야 하는 연산이 한 줄에 하나씩 주어진다. 연산은 두 정수 k, ℓ로 이루어져 있고, k번 연산을 단계 ℓ로 적용한다는 의미이다.

출력

입력으로 주어진 배열에 R개의 연산을 순서대로 수행한 결과를 출력한다.

예제

Example 1:

Input: 
3 8
1 2 3 4 5 6 7 8
9 10 11 12 13 14 15 16
17 18 19 20 21 22 23 24
25 26 27 28 29 30 31 32
33 34 35 36 37 38 39 40
41 42 43 44 45 46 47 48
49 50 51 52 53 54 55 56
57 58 59 60 61 62 63 64
1 1
2 2
3 1
4 2
5 2
6 1
7 1
8 2
Output: 
64 63 62 61 60 59 58 57
56 55 54 53 52 51 50 49
48 47 46 45 44 43 42 41
40 39 38 37 36 35 34 33
32 31 30 29 28 27 26 25
24 23 22 21 20 19 18 17
16 15 14 13 12 11 10 9
8 7 6 5 4 3 2 1

Example 2:

Input:
3 4
1 2 3 4 5 6 7 8
9 10 11 12 13 14 15 16
17 18 19 20 21 22 23 24
25 26 27 28 29 30 31 32
33 34 35 36 37 38 39 40
41 42 43 44 45 46 47 48
49 50 51 52 53 54 55 56
57 58 59 60 61 62 63 64
1 0
2 0
3 0
4 0
Output:
1 2 3 4 5 6 7 8
9 10 11 12 13 14 15 16
17 18 19 20 21 22 23 24
25 26 27 28 29 30 31 32
33 34 35 36 37 38 39 40
41 42 43 44 45 46 47 48
49 50 51 52 53 54 55 56
57 58 59 60 61 62 63 64

Example 3:

Input:
3 4
1 2 3 4 5 6 7 8
9 10 11 12 13 14 15 16
17 18 19 20 21 22 23 24
25 26 27 28 29 30 31 32
33 34 35 36 37 38 39 40
41 42 43 44 45 46 47 48
49 50 51 52 53 54 55 56
57 58 59 60 61 62 63 64
5 0
6 0
7 0
8 0
Output:
64 63 62 61 60 59 58 57
56 55 54 53 52 51 50 49
48 47 46 45 44 43 42 41
40 39 38 37 36 35 34 33
32 31 30 29 28 27 26 25
24 23 22 21 20 19 18 17
16 15 14 13 12 11 10 9
8 7 6 5 4 3 2 1

Example4:

Input:
3 8
1 2 3 4 5 6 7 8
9 10 11 12 13 14 15 16
17 18 19 20 21 22 23 24
25 26 27 28 29 30 31 32
33 34 35 36 37 38 39 40
41 42 43 44 45 46 47 48
49 50 51 52 53 54 55 56
57 58 59 60 61 62 63 64
1 2
8 1
7 2
4 0
3 2
5 1
6 1
2 2
Output:
45 37 47 39 41 33 43 35
46 38 48 40 42 34 44 36
61 53 63 55 57 49 59 51
62 54 64 56 58 50 60 52
13 5 15 7 9 1 11 3
14 6 16 8 10 2 12 4
29 21 31 23 25 17 27 19
30 22 32 24 26 18 28 20

조건

시간 제한 : 1초

메모리 제한 : 512 MB

풀이과정

풀이 1

import sys
input = sys.stdin.readline

# n = , r = 연산 수
n, r = map(int, input().split())

graph = []
for _ in range(2**n):
    graph.append(list(map(int, input().split())))
#graph = [[1,2,3,4,5,6,7,8], [9,10,11,12,13,14,15,16], [17,18,19,20,21,22,23,24],[25,26,27,28,29,30,31,32],
#[33,34,35,36,37,38,39,40],[41,42,43,44,45,46,47,48],[49,50,51,52,53,54,55,56],[57,58,59,60,61,62,63,64]]

for _ in range(r):
    k, l = map(int, input().split())

    l2 = 2**l
    a = []
    ngraph = [[0] * (2**n) for _ in range(2**n)]
    # 1번 연산
    if k == 1:
        for i in range(0, 2**n, l2):
            for j in range(0, 2**n, l2):
                for g in graph[i:i+l2]:
                    a.append(g[j:j+l2])

                for k in range(len(a)//2):
                    a[k], a[-k-1] = a[-k-1], a[k]

                for x in range(i, i+l2):
                    for y in range(j, j+l2):
                        ngraph[x][y] = a[x-i][y-j]

                a = []
    # 2번 연산
    elif k == 2:
        for i in range(0, 2**n, l2):
            for j in range(0, 2**n, l2):
                for g in graph[i:i+l2]:
                    a.append(g[j:j+l2])

                na = []
                for aa in a:
                    na.append(aa[::-1])

                a = []

                for x in range(i, i+l2):
                    for y in range(j, j+l2):
                        ngraph[x][y] = na[x-i][y-j]
    elif k == 3:
        for i in range(0, 2**n, l2):
            for j in range(0, 2**n, l2):
                for g in graph[i:i+l2]:
                    a.append(g[j:j+l2])

                na = [[0]*l2 for _ in range(l2)]
                for x in range(l2):
                    for y in range(l2):
                        na[x][y] = a[l2-y-1][x]

                a = []
                for x in range(i, i+l2):
                    for y in range(j, j+l2):
                        ngraph[x][y] = na[x-i][y-j]
    elif k == 4:
        for i in range(0, 2**n, l2):
            for j in range(0, 2**n, l2):
                for g in graph[i:i+l2]:
                    a.append(g[j:j+l2])

                na = [[0]*l2 for _ in range(l2)]
                for x in range(l2):
                    for y in range(l2):
                        na[x][y] = a[y][l2-x-1]

                a = []
                for x in range(i, i+l2):
                    for y in range(j, j+l2):
                        ngraph[x][y] = na[x-i][y-j]

    elif k == 5:
        di = dict()
        c = -1
        for i in range(0, 2**n, l2):
            c += 1
            for j in range(0, 2**n, l2):
                for g in graph[i:i+l2]:
                    a.append(g[j:j+l2])
                di[(i//l2, j//l2)] = a

                a = []
        for i in range(((2**n)//l2)//2):
            for j in range((2**n)//l2):
                di[(i, j)], di[(c-i,j)] = di[(c-i,j)], di[(i, j)]

        for i in range(((2**n)//l2)):
            for j in range((2**n)//l2):
                aaa = di[(i, j)]
                for a in range(i*l2, i*l2+l2):
                    for b in range(j*l2, j*l2+l2):
                        ngraph[a][b] = aaa[a-(i*l2)][b-(j*l2)]

    elif k == 6:
        di = dict()
        c = -1
        for i in range(0, 2**n, l2):
            c += 1
            for j in range(0, 2**n, l2):
                for g in graph[i:i+l2]:
                    a.append(g[j:j+l2])
                di[(i//l2, j//l2)] = a

                a = []

        for i in range(((2**n)//l2)):
            for j in range((2**n)//l2//2):
                di[(i, j)], di[(i,c - j)] = di[(i,c - j)], di[(i, j)]

        for i in range(((2**n)//l2)):
            for j in range((2**n)//l2):
                aaa = di[(i, j)]
                for a in range(i*l2, i*l2+l2):
                    for b in range(j*l2, j*l2+l2):
                        ngraph[a][b] = aaa[a-(i*l2)][b-(j*l2)]

    elif k == 7:
        di = dict()
        c = -1
        for i in range(0, 2**n, l2):
            c += 1
            for j in range(0, 2**n, l2):
                for g in graph[i:i+l2]:
                    a.append(g[j:j+l2])
                di[(i//l2, j//l2)] = a

                a = []
        ndi = dict()
        for i in range(((2**n)//l2)):
            for j in range((2**n)//l2):
                ndi[(i, j)] = di[(c - j,i)]

        for i in range(((2**n)//l2)):
            for j in range((2**n)//l2):
                aaa = ndi[(i, j)]
                for a in range(i*l2, i*l2+l2):
                    for b in range(j*l2, j*l2+l2):
                        ngraph[a][b] = aaa[a-(i*l2)][b-(j*l2)]

    elif k == 8:
        di = dict()
        c = -1
        for i in range(0, 2**n, l2):
            c += 1
            for j in range(0, 2**n, l2):
                for g in graph[i:i+l2]:
                    a.append(g[j:j+l2])
                di[(i//l2, j//l2)] = a

                a = []
        ndi = dict()
        for i in range(((2**n)//l2)):
            for j in range((2**n)//l2):
                ndi[(i, j)] = di[(j,c - i)]

        for i in range(((2**n)//l2)):
            for j in range((2**n)//l2):
                aaa = ndi[(i, j)]
                for a in range(i*l2, i*l2+l2):
                    for b in range(j*l2, j*l2+l2):
                        ngraph[a][b] = aaa[a-(i*l2)][b-(j*l2)]
    graph = ngraph

for g in graph:
    print(" ".join(map(str,g)))

Leave a comment