알고리즘(백준)/구현

[알고리즘/구현] 16926번 : 배열 돌리기 - python

되다 2023. 5. 9. 00:00

링크 : 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

 


  • 문제
  • 소요시간: 30분 실패


  • 설계하기(접근방법) 

1. 입력받기

2. 구현

 

가장 중요한 고려 사항은 2가지이다

 

1. 외부 배열을 어떻게 돌릴 것인가?

2. 외부 배열 내부의 조그만 배열은 어떻게 고려할 것인가?

 

1번은 한칸씩 꼬리를 물며 구현하면 된다

 

2번은 그림을 그려 규칙을 찾았는데

n,m중에 작은 값을 2로 나누면 그것이 내부 배열의 갯수가 되어, 상하좌우로 한칸씩 축소된 배열을 읽어서 1번을 실행해주면 된다

 

 

 

 

 


  • 코드(출력)
import sys

input = sys.stdin.readline

n, m, r = map(int, input().split())

arr = []

for _ in range(n):
    arr.append(list(map(int, input().split())))

for k in range(r):
    s = min(n, m) // 2
    for j in range(s):
        x, y = j, j
        pre = arr[x][y]
        for i in range(x + 1, n - j):
            tmp = arr[i][j]
            arr[i][j] = pre
            pre = tmp
        for i in range(y+1, m - j):
            tmp = arr[n - 1 - j][i]
            arr[n - 1 - j][i] = pre
            pre = tmp
        for i in range(n-j-2, j - 1, -1):
            tmp = arr[i][m-1-j]
            arr[i][m-1-j] = pre
            pre = tmp
        for i in range(m-2-j, j-1, -1):
            tmp = arr[j][i]
            arr[j][i] = pre
            pre = tmp

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

  • 얻어갈 부분

1. 이중배열을 어떻게 돌려야할지 참고했지만 아직 익숙하지 않다

2. 배열을 어떻게 연습할지 고민해보자