출처 : 백준,
더보기
풀이
def Solution(arr, TL, BR, R, bound_length):
x1, y1 = TL
x2, y2 = BR
x = x1
y = y1
dx = [0, 1, 0, -1]
dy = [1, 0, -1, 0]
index = 0
bound_list = []
for _ in range(bound_length):
if x == x2 and y == y1:
index+=1
elif x == x2 and y == y2:
index+=1
elif x == x1 and y == y2:
index+=1
bound_list.append(arr[x][y])
x += dx[index]
y += dy[index]
bound_list = bound_list[R :] + bound_list[: R]
x = x1
y = y1
index = 0
for element in bound_list:
if x == x2 and y == y1:
index+=1
elif x == x2 and y == y2:
index+=1
elif x == x1 and y == y2:
index+=1
arr[x][y] = (element)
x += dx[index]
y += dy[index]
if __name__ == '__main__':
N, M, R = map(int, input().split())
arr = [list(map(int, input().split())) for i in range(N)]
s_x, s_y, e_x, e_y = 0, 0, N-1, M-1
for i in range(min(N, M) // 2):
bound_length = (e_x - s_x + 1) * 2 + (e_y - s_y + 1) * 2 - 4
left = R % bound_length
Solution(arr, (s_x, s_y), (e_x, e_y), left, bound_length)
s_x += 1
s_y += 1
e_x -= 1
e_y -= 1
for line in arr:
for element in line:
print(element, end=' ')
print()
기본 원리는 각 테두리의 길이만큼 회전하면 원위치로 돌아오므로
R을 테두리의 길이로 나눈 만큼 나머지 만큼만 회전시켜줄 것이다.
Solution 함수에 회전 시킬 배열의 좌상, 우하 좌표를 넣고 이를 통해 테두리만 딴다.테두리로 이루어진 1차원 배열에서 1번 회전했다는 것은 맨 앞의 성분이 맨 뒤로 이동한 테두리와 같다.이를 이용해서 맨 앞의 R개만큼을 뒤로 보낸 테두리 배열을 새로 만들어서전체 배열의 테두리에 다시 넣어준다.
시간 복잡도
-
알게 된 점
-
고찰
-
'알고리즘 > Python' 카테고리의 다른 글
[python] 프로그래머스 - 2 x n 타일링 (0) | 2022.06.01 |
---|---|
[python] 프로그래머스 - N-Queens (0) | 2022.06.01 |
[python] 프로그래머스 - 행렬 테두리 회전하기 (0) | 2022.05.16 |
[python] 백준 1932 - 정수 삼각형 (0) | 2022.05.07 |
[python] 백준 1874 - 스택 수열 (0) | 2022.05.07 |