728x90
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
728x90
'Problem Solving > SWEA' 카테고리의 다른 글
[SWEA-1946][Python] 간단한 압축 풀기 (1) | 2023.10.19 |
---|---|
[SWEA-1948][Python] 날짜 계산기 (1) | 2023.10.19 |
[SWEA-1954][Python] 달팽이 숫자 (1) | 2023.10.18 |
[SWEA-1959][Python] 두 개의 숫자열 (0) | 2023.10.17 |
[SWEA-1966][Python] 숫자를 정렬하자 (1) | 2023.10.16 |
[SWEA-1970][Python] 쉬운 거스름돈 (0) | 2023.10.16 |
[SWEA-1974][Python] 스도쿠 검증 (0) | 2023.10.16 |
[SWEA-1979][Python] 어디에 단어가 들어갈 수 있을까 (1) | 2023.10.14 |