[Silver I] 배열 돌리기 3 - 16935
성능 요약
메모리: 30840 KB, 시간: 1108 ms
분류
구현(implementation)
문제 설명
크기가 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의 원소 Aij가 주어진다.
마지막 줄에는 수행해야 하는 연산이 주어진다. 연산은 공백으로 구분되어져 있고, 문제에서 설명한 연산 번호이며, 순서대로 적용시켜야 한다.
출력
입력으로 주어진 배열에 R개의 연산을 순서대로 수행한 결과를 출력한다.
def calc_1():
temp = [[0] * m for _ in range(n)]
for i in range(n):
temp[i] = arr[n-1-i]
return temp
def calc_2():
temp = [[0] * m for _ in range(n)]
for i in range(n):
for j in range(m):
temp[i][j] = arr[i][m-1-j]
return temp
def calc_3(arr, n, m):
temp = [[0] * n for _ in range(m)]
for i in range(m):
for j in range(n):
temp[i][j] = arr[n-1-j][i]
return temp
def calc_4(arr, n, m):
temp = [[0] * n for _ in range(m)]
for i in range(m):
for j in range(n):
temp[i][j] = arr[j][m - 1 - i]
return temp
def calc_5():
temp = [[0] * m for _ in range(n)]
for i in range(n // 2): # move position: 1 -> 2
for j in range(m // 2):
temp[i][j + m // 2] = arr[i][j]
for i in range(n // 2): # move position: 2 -> 3
for j in range(m // 2, m):
temp[i + n // 2][j] = arr[i][j]
for i in range(n // 2, n): # move position: 3 -> 4
for j in range(m // 2, m):
temp[i][j - m // 2] = arr[i][j]
for i in range(n // 2, n): # move position: 4 -> 1
for j in range(m // 2):
temp[i - n // 2][j] = arr[i][j]
return temp
def calc_6():
temp = [[0] * m for _ in range(n)]
for i in range(n // 2): # move position: 1 -> 4
for j in range(m // 2):
temp[i + n // 2][j] = arr[i][j]
for i in range(n // 2, n): # move position: 4 -> 3
for j in range(m // 2):
temp[i][j + m // 2] = arr[i][j]
for i in range(n // 2, n): # move position: 3 -> 2
for j in range(m // 2, m):
temp[i - n // 2][j] = arr[i][j]
for i in range(n // 2): # move position: 2 -> 1
for j in range(m // 2, m):
temp[i][j - m // 2] = arr[i][j]
return temp
n, m, r = map(int, input().split())
arr = [list(map(int, input().split())) for _ in range(n)]
operation = list(map(int, input().split()))
for oper in operation:
if oper == 1:
arr = calc_1()
elif oper == 2:
arr = calc_2()
elif oper == 3:
arr = calc_3(arr, n, m)
n, m = m, n
elif oper == 4:
arr = calc_4(arr, n, m)
n, m = m, n
elif oper == 5:
arr = calc_5()
else:
arr = calc_6()
for i in arr:
print(*i)
-풀이
1번 연산(상하반전) : n맨 뒤 인덱스 부터 첫 인덱스까지 차례대로 temp에 넣는다.
2번 연산(좌우반전) : temp에 m맨 뒤 인덱스부터 첫 인덱스가찌 차례대로 temp에 넣는다.
3번 연산(오른쪽 90도회전) : n축과 m축을 전환해서 가로축 첫값을 세로축끝값부터 차례대로 넣는다.
4번 연산(왼쪽 90도회전) : n축과 m축을 전화해서 가로축 끝값을 세로축 첫값부터 차례대로 넣는다.
5번 연산 : 범위를 2등분 해서 시계방향으로 이동
6번 연산 : 범위를 2등분 해서 반시계방향으로 이동
'알고리즘' 카테고리의 다른 글
[Gold V] 합이 0 - 3151 (투포인터, 이분탐색) (0) | 2022.06.21 |
---|---|
[Silver I] 트럭 - 13335 (큐,구현) (0) | 2022.06.19 |
[Silver III] 01타일 - 1904 (dp) (0) | 2022.06.17 |
[Silver V] 3의 배수 - 1769 (구현,재귀,문자열) (0) | 2022.06.16 |
[Silver V] 행렬 곱셈 - 2740 (수학) (0) | 2022.06.15 |