CodingTest

SWEA - 숫자 배열 회전(1961)

취업하고싶다! 2023. 10. 27. 18:41
 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com

 

문제

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])