16935 배열 돌리기 3

정민용·2023년 2월 1일
0

백준

목록 보기
6/286

문제

크기가 N×M인 배열이 있을 때, 배열에 연산을 R번 적용하려고 한다. 연산은 총 6가지가 있다.

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

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

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

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

5, 6번 연산을 수행하려면 배열을 크기가 N/2×M/2인 4개의 부분 배열로 나눠야 한다. 아래 그림은 크기가 6×8인 배열을 4개의 그룹으로 나눈 것이고, 1부터 4까지의 수로 나타냈다.

5번 연산은 1번 그룹의 부분 배열을 2번 그룹 위치로, 2번을 3번으로, 3번을 4번으로, 4번을 1번으로 이동시키는 연산이다.

6번 연산은 1번 그룹의 부분 배열을 4번 그룹 위치로, 4번을 3번으로, 3번을 2번으로, 2번을 1번으로 이동시키는 연산이다.

# 16935

# 1번 연산 : 상하 반전
# 2번 연산 : 좌우 반전
# 3번 연산 : 오른쪽 90도 회전
# 4번 연산 : 왼쪽 90도 회전
# 5, 6번 연산을 하기 위해서 배열을 4조각으로 쪼개야한다.
# 5번 연산 : 1->2, 2->3, 3->4, 4->1
# 6번 연산 : 1->4, 2->1, 3->2, 4->3

import copy

n, m, r = map(int, input().split())
arr = []
for _ in range(n):
    arr.append(list(map(int, input().split())))

doing = list(map(int, input().split()))

for x in range(r):
    do = doing[x]
    copy_arr = []
    if do == 1:
        # 상하 반전
        for i in range(n-1, -1, -1):
            copy_arr.append(arr[i])
        arr = copy_arr
    elif do == 2:
        # 좌우 반전
        for i in range(n):
            copy_arr.append([])
            for j in range(m):
                copy_arr[i].append(arr[i][m-j-1])
        arr = copy_arr
    elif do == 3:
        # 오른쪽 90도 회전
        arr_i = 0
        for i in range(m):
            copy_arr.append([])
            for j in range(n-1, -1, -1):
                copy_arr[arr_i].append(arr[j][i])
            arr_i += 1
        arr = copy_arr
        n, m= m, n
    elif do == 4:
        # 왼쪽 90도 회전
        arr_i = 0
        for i in range(m-1, -1, -1):
            copy_arr.append([])
            for j in range(n):
                copy_arr[arr_i].append(arr[j][i])
            arr_i += 1
        arr = copy_arr
        n, m = m, n
    elif do == 5:
        # 1->2, 2->3, 3->4, 4->1
        copy_arr = copy.deepcopy(arr)
        half_x, half_y = m//2, n//2
        for i in range(n):
            for j in range(m):
                if i < half_y:
                    if j < half_x:
                        # 1 -> 2
                        arr[i][j + half_x] = copy_arr[i][j]
                    else:
                        # 2 -> 3
                        arr[i + half_y][j] = copy_arr[i][j]
                else:
                    if j < half_x:
                        # 4 -> 1
                        arr[i - half_y][j] = copy_arr[i][j]
                    else:
                        # 3 -> 4
                        arr[i][j - half_x] = copy_arr[i][j]
    else:
        # 1->4, 2->1, 3->2, 4->3
        copy_arr = copy.deepcopy(arr)
        half_x, half_y = m//2, n//2
        for i in range(n):
            for j in range(m):
                if i < half_y:
                    if j < half_x:
                        # 1 -> 4
                        arr[i + half_y][j] = copy_arr[i][j]
                    else:
                        # 2 -> 1
                        arr[i][j - half_x] = copy_arr[i][j]
                else:
                    if j < half_x:
                        # 4 -> 3
                        arr[i][j + half_x] = copy_arr[i][j]
                    else:
                        # 3 -> 2
                        arr[i - half_y][j] = copy_arr[i][j]
                        
for a in arr:
    print(*a)

백준 16935 배열 돌리기 3

0개의 댓글