상세 컨텐츠

본문 제목

[백준/파이썬]16926 배열 돌리기1

알고리즘 문제풀이

by 한백인데용 2023. 8. 11. 00:08

본문

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

 

문제

백준 16926 배열 돌리기1

노가다 문제다

 

쉽게 풀 수 있을지 모르겠는데, 난 노가다로 풀었다.

 

이 문제에서 나는 기준점을 어떻게 잡아야 할지 부터 생각했다.

 

(회전하는 고리가 총 몇개가 만들어질 수 있는지)

 

예를 들어 4, 4의 배열이라고 하면 2개의 회전 고리가 만들어질 수 있다.

 

5, 4의 경우도 마찬가지다.

 

6, 6의 경우는 3개

 

2, 2의 경우는 1개다.

 

이 기준을 나는 가로 세로 길이중 더 작은 값을 나누기 2한 값의 올림값으로 했다.

 

예를 들어 4, 4라면 4/2 = 2.0

3, 3이라면 3/2 = 1.5 => 회전 고리 2개

 

지금 와서 문제를 다시 보니 min(n, m) mod 2 = 0이라는 조건이 있었다 ㅋㅋ 그냥 나누기 2 하면 될듯하다.

 

회전 고리 개수를 구하는 방법을 찾았다면 종이에 회전이 어떻게 되는지 적어보며 그대로 코드로 구현하면 된다.

 

정답

import math
import sys

def lotation(standard) :
    max_down_x = n-1-standard
    max_right_y = m-1-standard
    max_up_x = 0+standard

    for j in range(standard, max_down_x+1) :
        if j == standard :
            c = arr[j][standard]
        else :
            arr[j][standard], c = c, arr[j][standard]
    for j in range(standard+1, max_right_y+1) :
        arr[max_down_x][j], c = c, arr[max_down_x][j]
    for j in range(max_down_x-1, max_up_x-1, -1) :
        arr[j][max_right_y], c = c, arr[j][max_right_y]
    for j in range(max_right_y-1, standard-1, -1) :
        arr[standard][j], c = c, arr[standard][j]



n, m, r = map(int, sys.stdin.readline().rstrip().split())

arr = []


for i in range(n) :
    arr.append(list(sys.stdin.readline().rstrip().split()))

w = math.ceil(min(n, m)/2)

for q in range(r) :
    for i in range(w) :
        lotation(i)

for l in arr :
    print(' '.join(l))
728x90
반응형

관련글 더보기