728x90

문제

N x N 행렬이 주어질 때,

시계 방향으로 90도, 180도, 270도 회전한 모양을 출력하라.

 

제약 사항

N은 3 이상 7 이하이다.

 

입력

가장 첫 줄에는 테스트 케이스의 개수 T가 주어지고, 그 아래로 각 테스트 케이스가 주어진다.

각 테스트 케이스의 첫 번째 줄에 N이 주어지고,

다음 N 줄에는 N x N 행렬이 주어진다.

 

출력

출력의 첫 줄은 '#t'로 시작하고,

다음 N줄에 걸쳐서 90도, 180도, 270도 회전한 모양을 출력한다.

입력과는 달리 출력에서는 회전한 모양 사이에만 공백이 존재함에 유의하라.

(t는 테스트 케이스의 번호를 의미하며 1부터 시작한다.)

 

예제

[입력] [출력]
10
3
1 2 3
4 5 6
7 8 9
6
6 9 4 7 0 5
8 9 9 2 6 5
6 8 5 4 9 8
2 2 7 7 8 4
7 5 1 9 7 9
8 9 3 9 7 6
#1
741 987 369
852 654 258
963 321 147
#2
872686 679398 558496
952899 979157 069877
317594 487722 724799
997427 894586 495713
778960 562998 998259
694855 507496 686278

 

문제 해결 방법

  • 2차원 배열(리스트)의 구조와 접근 방법을 알아야 풀 수 있는 문제였다.
  • 아래의 예를 이용하여 코드를 설명해본다. 
1 2 3
4 5 6
7 8 9

 

  • 위의 예를 오른쪽으로 90도 회전시키면 아래와 같다.
7 4 1
8 5 2
9 6 3

 

  • 회전 원리는 컬럼(열)별로 원소를 접근하는데 마지막 원소부터 처음 원소까지 순회하면서 해당 숫자들을 객체(리스트)에 넣어주는 것이다.
    • 예를 들어, 우선 맨 처음 인 @[1, 4, 7]@부터 시작하여 마지막 요소인 7부터 시작하여 첫 번째 요소인 1까지 순회하며 해당 숫자들을 리스트(@row_items@)에 넣어준다. (7 → 4 → 1, @row_items = [7, 4, 1]@)
    • 한 열의 모든 원소들의 순회를 마칠 때마다, @row_items@ 리스트 안에는 각 열에 포함된 숫자들이 들어가게 되며, 이 @row_items@ 리스트를 회전된 행렬(@rotate_matrix@) 리스트에 넣어준다.
    • 이 과정을 마지막 열까지 진행해준다. 
# 시계 방향으로 90도 회전시키는 함수
def rotate_90_with_clockwise(matrix, N):
    roated_matrix = []

    for i in range(N):
        row_items = []

        for j in range(N - 1, -1, -1):
            item = matrix[j][i]
            row_items.append(item)
        
        roated_matrix.append(row_items)
    
    return roated_matrix

 

  • 이 함수를 토대로 시계 방향으로 90도, 180도, 270도 회전 시킨 행렬을 각각 변수에 넣어준다.
# 회전시키기
## 90도 회전
matrix_90 = rotate_90_with_clockwise(matrix, N)

## 180도 회전
matrix_180 = rotate_90_with_clockwise(matrix_90, N)

## 270도 회전
matrix_270 = rotate_90_with_clockwise(matrix_180, N)

 

  • 정답 출력 부분은 아래와 같이 작성하였다.
  • 정답 출력 부분을 해결하는데 생각보다 시간이 오래걸렸다.
  • @map@ 함수를 이용하여 각 행렬에 있는 행(@row@) 값의 요소들을 문자열 형태(@string@)의 연속된 숫자들로 만들었고, 각각을 @N@번 동안 출력하도록 하였다.
# 정답 출력
print(f"#{test_case}")

for i in range(N):
    row_90 = ''.join(map(str, matrix_90[i]))
    row_180 = ''.join(map(str, matrix_180[i]))
    row_270 = ''.join(map(str, matrix_270[i]))

    print(row_90, row_180, row_270)

 

코드

# 시계 방향으로 90도 회전시키는 함수
def rotate_90_with_clockwise(matrix, N):
    roated_matrix = []

    for i in range(N):
        row_items = []

        for j in range(N - 1, -1, -1):
            item = matrix[j][i]
            row_items.append(item)
        
        roated_matrix.append(row_items)
    
    return roated_matrix

T = int(input())

for test_case in range(1, 1 + T):
    N = int(input())
    
    matrix = []

    for i in range(N):
        num_list = list(map(int, input().split()))
        matrix.append(num_list)
    
    # 회전시키기
    ## 90도 회전
    matrix_90 = rotate_90_with_clockwise(matrix, N)

    ## 180도 회전
    matrix_180 = rotate_90_with_clockwise(matrix_90, N)

    ## 270도 회전
    matrix_270 = rotate_90_with_clockwise(matrix_180, N)

    # 정답 출력
    print(f"#{test_case}")

    for i in range(N):
        row_90 = ''.join(map(str, matrix_90[i]))
        row_180 = ''.join(map(str, matrix_180[i]))
        row_270 = ''.join(map(str, matrix_270[i]))
        
        print(row_90, row_180, row_270)

 

참고

  • 난이도: D2

 

문제를 풀고나서

  • 2차원 배열 안에 있는 원소들에 접근하고, 출력 방법까지 세심하게 고민해봐야 했던 문제였다.
  • @map@ 함수를 이용하여 배열 안의 정수형 요소들을 심플하게 문자열 형태로 변환시키는 연습을 해볼 수 있었던 재미있는 문제였다.
728x90