Algorithm (PS)

[백준] 16926 배열돌리기 1 Python

minjiwoo 2022. 9. 25. 00:31
728x90

https://www.acmicpc.net/problem/16926

 

16926번: 배열 돌리기 1

크기가 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]

www.acmicpc.net

제한 조건에 min(n,m) % 2 == 0 이라고 표시되어 있다 이를 활용해서 바깥쪽 직사각형에서 안쪽 직사각형을 확인한다. 
확인하는 순서는 맨 좌측 , 하단, 우측, 상단이다. 그래서 맨 좌측의 지점이 되는 i,i을 시작지점이라고 보고, 좌표와 이때 array[i][i] 의 값을 미리 저장해 둔다. 

바꿀 좌표로 이동해서, 바꿀좌표에 있는 값을 temp 변수에 저장해 놓는다 
그리고 현재 확인중인 좌표에 이전 값을 넣어준다 : array[x][y] = value 
value 값을 temp에 저장해둔 값으로 갱신한다. 

n, m, r = map(int, input().split(' '))
array = []
for i in range(n):
    data = list(map(int, input().split(' ')))
    array.append(data)

# r 회 회전하기
for _ in range(r):
    for i in range(min(n, m)//2):
        x, y = i, i # 맨 처음 좌표 지점
        value = array[x][y] # 맨 처음 좌표가 가진 값
        # 확인방향 맨 좌측 -> 하단 -> 우측 -> 상

        for j in range(i+1, n-i): # left
            x = j
            temp = array[x][y] # 현재 좌표의 값, 바꿀 예정
            array[x][y] = value # 현재 좌표에 이전 값을 넣어준다
            value = temp # 이전 값으로 갱신하기

        for j in range(i+1, m-i): # down
            y = j
            temp = array[x][y]
            array[x][y] = value
            value = temp

        for j in range(i+1, n-i): # right
            x = n - j - 1 # -1 을 해줘야 함 왜냐면 그 이전에 좌표는 예를들어서 n = m = 4 이면 (3,3) 임
            temp = array[x][y] # -1을 해줘야 예전값을 넣을 그 다음 칸을 가리킬 수 있음
            array[x][y] = value
            value = temp

        for j in range(i+1, m-i): # top
            y = n - j - 1
            temp = array[x][y]
            array[x][y] = value
            value = temp

for i in range(n):
    for j in range(m):
        print(array[i][j], end=' ')
    print()
728x90