https://www.acmicpc.net/problem/16926
노가다 문제다
쉽게 풀 수 있을지 모르겠는데, 난 노가다로 풀었다.
이 문제에서 나는 기준점을 어떻게 잡아야 할지 부터 생각했다.
(회전하는 고리가 총 몇개가 만들어질 수 있는지)
예를 들어 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))
[백준/파이썬]14888 연산자 끼워넣기 (0) | 2023.08.16 |
---|---|
[백준/파이썬]9935 문자열 폭발 (0) | 2023.08.11 |
[백준/파이썬]2579 계단 오르기 (0) | 2023.08.09 |
[백준/파이썬]24511 queuestack (0) | 2023.08.04 |
[백준/파이썬]5430 AC (0) | 2023.07.26 |