[Baekjoon] 배열 돌리기 1
Updated:
문제
크기가 N×M인 배열이 있을 때, 배열을 돌려보려고 한다. 배열은 다음과 같이 반시계 방향으로 돌려야 한다.
A[1][1] ← A[1][2] ← A[1][3] ← A[1][4] ← A[1][5]
↓ ↑
A[2][1] A[2][2] ← A[2][3] ← A[2][4] A[2][5]
↓ ↓ ↑ ↑
A[3][1] A[3][2] → A[3][3] → A[3][4] A[3][5]
↓ ↑
A[4][1] → A[4][2] → A[4][3] → A[4][4] → A[4][5]
예를 들어, 아래와 같은 배열을 2번 회전시키면 다음과 같이 변하게 된다.
1 2 3 4 2 3 4 8 3 4 8 6
5 6 7 8 1 7 7 6 2 7 8 2
9 8 7 6 → 5 6 8 2 → 1 7 6 3
5 4 3 2 9 5 4 3 5 9 5 4
<시작> <회전1> <회전2>
배열과 정수 R이 주어졌을 때, 배열을 R번 회전시킨 결과를 구해보자.
입력
첫째 줄에 배열의 크기 N, M과 수행해야 하는 회전의 수 R이 주어진다.
둘째 줄부터 N개의 줄에 배열 A의 원소 Aij가 주어진다.
출력
입력으로 주어진 배열을 R번 회전시킨 결과를 출력한다.
예제
Example 1:
Input:
4 4 2
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
Output:
3 4 8 12
2 11 10 16
1 7 6 15
5 9 13 14
Example 2:
Input:
5 4 7
1 2 3 4
7 8 9 10
13 14 15 16
19 20 21 22
25 26 27 28
Output:
28 27 26 25
22 9 15 19
16 8 21 13
10 14 20 7
4 3 2 1
Example 3:
Input:
2 2 3
1 1
1 1
Output:
1 1
1 1
조건
시간 제한 : 1초
메모리 제한 : 512 MB
풀이과정
풀이 1
일일이 돌리다보니 시간이 오래걸렸다.
import sys
input = sys.stdin.readline
n, m, r = map(int, input().split())
graph = []
for _ in range(n):
graph.append(list(map(int, input().split())))
cnt = (min(len(graph), len(graph[0]))) // 2
def rotate(graph):
ngraph = [[0]*m for _ in range(n)]
for i in range(cnt):
n1 = (i, i)
n2 = (n-1-i,i)
n3 = (n-1-i,m-1-i)
n4 = (i,m-1-i)
# n1 -> n2
x, y = n1
nx, ny = n2
for k in range(x, nx):
ngraph[k+1][y] = graph[k][y]
# n2 -> n3
x, y = n2
nx, ny = n3
for k in range(y, ny):
ngraph[x][k+1] = graph[x][k]
# n3 -> n4
x, y = n3
nx, ny = n4
for k in range(x, nx, -1):
ngraph[k-1][y] = graph[k][y]
# n4 -> n1
x, y = n4
nx, ny = n1
for k in range(y, ny, -1):
ngraph[x][k-1] = graph[x][k]
return ngraph
for _ in range(r):
graph = rotate(graph)
for g in graph:
print(" ".join(list(map(str,g))))
풀이 2
n,m,r = map(int, input().split())
a = [list(map(int,input().split())) for _ in range(n)]
groups = []
groupn = min(n,m)//2
for k in range(groupn):
group = []
for j in range(k, m-k):
group.append(a[k][j])
for i in range(k+1,n-k-1):
group.append(a[i][m-k-1])
for j in range(m-k-1,k,-1):
group.append(a[n-k-1][j])
for i in range(n-k-1,k,-1):
group.append(a[i][k])
groups.append(group)
for k in range(groupn):
group = groups[k]
l = len(group)
index = r%l
for j in range(k, m-k):
a[k][j] = group[index]
index = (index+1)%l
for i in range(k+1, n-k-1):
a[i][m-k-1] = group[index]
index = (index+1)%l
for j in range(m-k-1,k,-1):
a[n-k-1][j] = group[index]
index = (index+1)%l
for i in range(n-k-1,k,-1):
a[i][k] = group[index]
index = (index+1)%l
for row in a:
print(' '.join(map(str,row)))
Leave a comment