백준 온라인 저지 16935번 배열 돌리기 3

김선모·2024년 7월 7일

Baekjoon Online Judge

목록 보기
31/31
post-thumbnail

문제


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

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

1 6 2 9 8 4 → 4 2 9 3 1 8
7 2 6 9 8 2 → 9 2 3 6 1 5
1 8 3 4 2 9 → 7 4 6 2 3 1
7 4 6 2 3 1 → 1 8 3 4 2 9
9 2 3 6 1 5 → 7 2 6 9 8 2
4 2 9 3 1 8 → 1 6 2 9 8 4
<배열> <연산 결과>

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

1 6 2 9 8 4 → 4 8 9 2 6 1
7 2 6 9 8 2 → 2 8 9 6 2 7
1 8 3 4 2 9 → 9 2 4 3 8 1
7 4 6 2 3 1 → 1 3 2 6 4 7
9 2 3 6 1 5 → 5 1 6 3 2 9
4 2 9 3 1 8 → 8 1 3 9 2 4
<배열> <연산 결과>
3번 연산은 오른쪽으로 90도 회전시키는 연산이다.

1 6 2 9 8 4 → 4 9 7 1 7 1
7 2 6 9 8 2 → 2 2 4 8 2 6
1 8 3 4 2 9 → 9 3 6 3 6 2
7 4 6 2 3 1 → 3 6 2 4 9 9
9 2 3 6 1 5 → 1 1 3 2 8 8
4 2 9 3 1 8 → 8 5 1 9 2 4
<배열> <연산 결과>
4번 연산은 왼쪽으로 90도 회전시키는 연산이다.

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

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

3 2 6 3 1 2 9 7 → 2 1 3 8 3 2 6 3
9 7 8 2 1 4 5 3 → 1 3 2 8 9 7 8 2
5 9 2 1 9 6 1 8 → 4 5 1 9 5 9 2 1
2 1 3 8 6 3 9 2 → 6 3 9 2 1 2 9 7
1 3 2 8 7 9 2 1 → 7 9 2 1 1 4 5 3
4 5 1 9 8 2 1 3 → 8 2 1 3 9 6 1 8
<배열> <연산 결과>
6번 연산은 1번 그룹의 부분 배열을 4번 그룹 위치로, 4번을 3번으로, 3번을 2번으로, 2번을 1번으로 이동시키는 연산이다.

3 2 6 3 1 2 9 7 → 1 2 9 7 6 3 9 2
9 7 8 2 1 4 5 3 → 1 4 5 3 7 9 2 1
5 9 2 1 9 6 1 8 → 9 6 1 8 8 2 1 3
2 1 3 8 6 3 9 2 → 3 2 6 3 2 1 3 8
1 3 2 8 7 9 2 1 → 9 7 8 2 1 3 2 8
4 5 1 9 8 2 1 3 → 5 9 2 1 4 5 1 9
<배열> <연산 결과>

입력


첫째 줄에 배열의 크기 N, M과 수행해야 하는 연산의 수 R이 주어진다.

둘째 줄부터 N개의 줄에 배열 A의 원소 A[i][j]가 주어진다.

마지막 줄에는 수행해야 하는 연산이 주어진다. 연산은 공백으로 구분되어져 있고, 문제에서 설명한 연산 번호이며, 순서대로 적용시켜야 한다.

출력


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

제한


  • 2 ≤ N, M ≤ 100
  • 1 ≤ R ≤ 1,000
  • N, M은 짝수
  • 1 ≤ A[i][j] ≤ 108

Code

n,m,r = map(int,input().split())
m = []
for i in range(n) :
    m.append(list(map(int,input().split())))
def ONE(m) :
    t = []
    for i in range(1,len(m)+1) :
        t.append(m[-i])
    return t
def TWO(m) :
    t = []
    for i in range(len(m)) :
        t.append(m[i][::-1])
    return t
def THREE(m) :
    t = []
    lenm = len(m)
    lenm2 = len(m[0])
    for i in range(lenm2) :
        t1 = []
        for j in range(1,len(m)+1) :
            t1.append(m[-j][i])
        t.append(t1)
    return t
def FOUR(m) :
    t = []
    lenm = len(m)
    lenm2 = len(m[0])
    for i in range(1,lenm2+1) :
        t1 = []
        for j in range(lenm) :
            t1.append(m[j][-i])
        t.append(t1)
    return t
def FIVE(m) :
    one,two,three,four = [],[],[],[]
    for i in range(len(m)//2) :
        one.append(m[i][:len(m[i])//2])
        two.append(m[i][len(m[i])//2:])
    for i in range(len(m)//2,len(m)) :
        four.append(m[i][:len(m[i])//2])
        three.append(m[i][len(m[i])//2:])
    t = []
    for i in range(len(m)//2) :
        t.append(four[i]+one[i])
    for i in range(len(m)//2) :
        t.append(three[i]+two[i])
    return t
def SIX(m) :
    one,two,three,four = [],[],[],[]
    for i in range(len(m)//2) :
        one.append(m[i][len(m[i])//2:])
        three.append(m[i][:len(m[i])//2])
    for i in range(len(m)//2,len(m)) :
        two.append(m[i][len(m[i])//2:])
        four.append(m[i][:len(m[i])//2])
    t = []
    for i in range(len(m)//2) :
        t.append(one[i]+two[i])
    for i in range(len(m)//2) :
        t.append(three[i]+four[i])
    return t
command = list(map(int,input().split()))
for i in range(len(command)) :
    if command[i] == 1 : m = ONE(m)
    elif command[i] == 2 : m = TWO(m)
    elif command[i] == 3 : m = THREE(m)
    elif command[i] == 4 : m = FOUR(m)
    elif command[i] == 5 : m = FIVE(m)
    elif command[i] == 6 : m = SIX(m)
for i in range(len(m)) :
    print(*m[i])

0개의 댓글