SW Expert Academy
SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!
swexpertacademy.com
N x N 행렬이 주어질 때, 시계 방향으로 90도, 180도, 270도 회전한 모양을 출력.
[제약 사항]
N은 3 이상 7 이하
입력과는 달리 출력에서는 회전한 모양 사이에만 공백이 존재함에 유의
1 2 3 741 987 369
4 5 6 => 852 654 258
7 8 9 963 321 147
회전은 이중 for문을 사용해 배열의 값을 가져오는 방법으로 구현했다.
배열의 인덱스 r,c는 각도에 따라 아래 표처럼 나타낼 수 있다.
angle | 0 | 90 | 180 | 270 |
---|---|---|---|---|
angle_r | r | n-c-1 | n-r-1 | c |
angle_c | c | r | n-c-1 | n-r-1 |
따라서, 각 각도에 대응하는 인덱스(a
)의 몫과 나머지 연산을 통해 값이 적절히 나타나고 사라지도록하였다.
angle | 0 | 90 | 180 | 270 |
---|---|---|---|---|
a | 0 | 1 | 2 | 3 |
a//2 | 0 | 0 | 1 | 1 |
a%2 | 0 | 1 | 0 | 1 |
위 방법으로 각 각도에 대응하는 결과리스트를 가져와 양식에 맞게 출력하였다.
* 사실 90도 회전시킨 표를 한번 더 90도 회전시키면 180도가 나오고, 그것을 또 회전시키면 270도가 나오므로 배열을 90도로 회전시키는 함수 하나만으로도 풀이가 가능하다..
def rotation(table, angle=0): # 회전하는 각도에 따른 배열을 가져오는 함수
n = len(table)
a = (angle//90) % 4
new_table = []
for r in range(n):
temp = ''
for c in range(n):
# 아래 표에 따라 순회하며 값을 가져옴
# angle 0 90 180 270
# angle_r r n-c-1 n-r-1 c
# angle_c c r n-c-1 n-r-1
angle_r = (r+(n-2*r-1)*(a//2))*(1-a%2)+(c+(n-2*c-1)*(1-a//2))*(a%2)
angle_c = (c+(n-2*c-1)*(a//2))*(1-a%2)+(r+(n-2*r-1)*(a//2))*(a%2)
temp += str(table[angle_r][angle_c])
new_table.append(temp) # 출력을 쉽게하기 위해 숫자를 문자열로 바꾸어 1차원리스트에 저장
return new_table
T = int(input())
for tc in range(1, T+1):
N = int(input())
arr = [list(map(int, input().split())) for _ in range(N)]
arr90 = rotation(arr, 90)
arr180 = rotation(arr, 180)
arr270 = rotation(arr, 270)
print('#{}'.format(tc))
for i in range(N):
print(arr90[i], arr180[i], arr270[i])
[SWEA] #1859 백만 장자 프로젝트.python(파이썬) (0) | 2021.08.18 |
---|---|
[SWEA] #4408 자기 방으로 돌아가기.python(파이썬) (0) | 2021.08.17 |
[SWEA] #5356 의석이의 세로로 말해요.python(파이썬) (0) | 2021.08.16 |
[SWEA] #5432 쇠막대기 자르기 평범한 숫자.python(파이썬) (0) | 2021.08.15 |
[SWEA] #11736 평범한 숫자.python(파이썬) (0) | 2021.07.21 |