문제
N x N 행렬이 주어질 때,
시계 방향으로 90도, 180도, 270도 회전한 모양을 출력하라.
[제약 사항]
N은 3 이상 7 이하이다.
[입력]
가장 첫 줄에는 테스트 케이스의 개수 T가 주어지고, 그 아래로 각 테스트 케이스가 주어진다.
각 테스트 케이스의 첫 번째 줄에 N이 주어지고,
다음 N 줄에는 N x N 행렬이 주어진다.
접근방식
90도 돌릴 배열, 180도 돌릴 배열, 270도 돌릴 배열을 빈 배열로 선언
문제가 처음에 이해되지 않아 예제 문제로 로직을 파악해봤음
arr = [[1,2,3], [4,5,6], [7,8,9]] 일 경우, 배열의 인덱스는
[0][0] [0][1] [0][2]
[1][0] [1][1] [1][2]
[2][0] [2][1] [2][2]
90도 돌린 결과는
[2][0] [1][0] [0][0]
[2][1] [1][1] [0][1]
[2][2] [1][2] [0][2]
180도 돌린 결과는
[2][2] [2][1] [2][0]
[1][2] [1][1] [1][0]
[0][2] [0][1] [0][0]
270도 돌린 결과는
[0][2] [1][2] [2][2]
[0][1] [1][1] [2][1]
[0][0] [1][0] [2][0]
가 나옴.
이를 통해 돌린 결과값마다 범위를 찾아냈음
90도의 경우 arr[x][y]라 하면 x의 값이 2부터 0까지 줄어들고 다시 2부터 0까지 줄어들고를 반복, y의 값은 0부터 시작해서 x의 값이 2부터 0까지 줄어들동안 계속 0을 유지하고 x값이 다 줄어들면 1을 증가, 2까지 이를 반복함
이런식으로 각 각도마다 로직을 찾아서 적용
위의 예제대로 값을 주고 이 로직을 적용하고 각 배열을 print하면
[7, 4, 1, 8, 5, 2, 9, 6, 3]
[9, 8, 7, 6, 5, 4, 3, 2, 1]
[3, 6, 9, 2, 5, 8, 1, 4, 7]
이 결과가 나옴.
하지만 원하는 결과값은
741 987 369
852 654 258
963 321 147 임
결과값을 보면 90도 돌린 배열에서 N개만큼을 붙여서 출력하고 한 칸 띄고 180도 돌린 배열에서 N개만큼 붙여서 출력하고 한 칸 띄고 270도 돌린 배열에서 N개만큼 붙여서 출력함
붙인 결과들을 저장할 배열 ans_90, ans_180, ans_270을 빈 배열로 선언
그리고 각 배열의 값들을 N개만큼 붙이기 위해 join() 메서드 사용
하지만 int형에 join() 메서드를 사용하면
# TypeError: seqeunce item 0: expected str instance, int found 라는 오류 문구가 뜸
이를 해결하기 위해 map함수를 사용해 str로 변경해줌
''.join(map(str, arr~)) 를 사용
N개만큼 각각의 배열에 문자열을 붙여서 더해주고 마지막에 각각의 인덱스로 배열에서 해당값들을 출력해주면 끝
코드
T = int(input())
for m in range(1, T+1):
N = int(input())
arr = [list(map(int, input().split())) for _ in range(N)]
arr_90 = []
arr_180 = []
arr_270 = []
for i in range(N):
for j in range(N-1, -1, -1):
arr_90.append(arr[j][i])
for i in range(N-1, -1, -1):
for j in range(N-1, -1, -1):
arr_180.append(arr[i][j])
for i in range(N-1, -1, -1):
for j in range(N):
arr_270.append(arr[j][i])
ans_90 = []
ans_180 = []
ans_270 = []
for x in range(0, len(arr_90), len(arr_90) // N):
ans_90.append(''.join(map(str, arr_90[x:x+N])))
for x in range(0, len(arr_180), len(arr_180) // N):
ans_180.append(''.join(map(str, arr_180[x:x+N])))
for x in range(0, len(arr_270), len(arr_270) // N):
ans_270.append(''.join(map(str, arr_270[x:x+N])))
print('#'+str(m))
for y in range(N):
print(ans_90[y], ans_180[y], ans_270[y])
'CodingTest' 카테고리의 다른 글
코딩테스트 준비 - 파이썬 해시 정리 (1) | 2023.10.30 |
---|---|
SWEA - Flatten(1208) (1) | 2023.10.28 |
SWEA - 파스칼의 삼각형(2005) (0) | 2023.10.27 |
SWEA - 쉬운 거스름돈(1970) (1) | 2023.10.27 |
SWEA - 간단한 압축풀기(1946) (0) | 2023.10.25 |