문제: https://www.acmicpc.net/problem/16935
조건
- 2 ≤ N, M ≤ 100
- 1 ≤ R ≤ 1,000
- N, M은 짝수
- 1 ≤ Aij ≤ 108
입력
첫째 줄에 배열의 크기가 N, M과 수행해야 하는 연산 R 입력
둘째 줄부터 2차원 배열 값 입력
마지막 줄은 수행해야하는 연산 입력 (공백으로 구분되어 있고, 순서대로 적용)
출력
입력으로 주어진 배열에 R개의 연산을 순서대로 수행한 결과를 출력
import sys
sys.stdin = open('input.txt')
input = sys.stdin.readline
n, m, r = map(int, input().split())
arr = [[int(x) for x in input().split()] for _ in range(n)]
options = [int(x) for x in input().split()]
for option in options:
if option == 1:
arr = arr[::-1]
elif option == 2:
arr = list(map(lambda x: x[::-1], arr))
elif option == 3:
arr = list(zip(*arr[::-1]))
n, m = m, n
elif option == 4:
arr = list(map(list, zip(*arr)))[::-1]
n, m = m, n
else:
arr1 = map(lambda x: x[:m//2], arr[:n//2])
arr2 = map(lambda x: x[m//2:], arr[:n//2])
arr3 = map(lambda x: x[:m//2], arr[n//2:])
arr4 = map(lambda x: x[m//2:], arr[n//2:])
if option == 5:
arr = list(zip(arr3, arr1)) + list(zip(arr4, arr2))
elif option == 6:
arr = list(zip(arr2, arr4)) + list(zip(arr1, arr3))
arr = list(map(lambda x: x[0]+x[1], arr))
for row in arr:
print(*row)
풀이
입출력 부분은 기본적인 것이고, 문제의 메인은 6개의 연산이라고 생각된다.
1. 상하 반전
- 2차원 배열이므로 행을 역으로 정렬시키면 상하가 반전된다
arr = arr[::-1]
2. 좌우 반전
- 각 행에 있는 배열을 역으로 정렬시키면 된다. 이때 lambda 함수를 통해서 x를 간단하게 표현했다.
arr = list(map(lambda x: x[::-1], arr))
3. 오른쪽 90도 회전
- 각 행을 상하 반전 하고 이를 zip함수를 통해서 각 리스트의 0번째, 1번째, ... n번째 원소끼리 묶어서 새로 튜플로 만들고, 다시 리스트 형태로 바꾸어서 arr형태로 만든다.
- 행, 열 사이즈 변환 주의
arr = list(zip(*arr[::-1]))
n, m = m, n
예시:
1 | 2 |
3 | 4 |
원래 배열
3 | 4 |
1 | 2 |
상하 반전
3 | 1 |
4 | 2 |
zip함수로 새로 정렬해서 다시 리스트로 묶은 형태
4. 왼쪽 90도 회전
- 2차원 배열을 대각선을 기준으로 반전하고( zip함수) 상하 반전하는 형태
- 행, 열 사이즈 변환 주의
arr = list(map(list, zip(*arr)))[::-1]
n, m = m, n
예시:
원래 배열
1 | 2 |
3 | 4 |
대각선 반전
1 | 3 |
2 | 4 |
상하 반전 (왼쪽으로 90도 회전한 형태)
2 | 4 |
1 | 3 |
5, 6. 각 사분면을 기준으로 원소들을 배열만 시키는 연산
arr = list(zip(arr3, arr1)) + list(zip(arr4, arr2))
5번 예시(6번은 반대로):
원래 배열
1 | 2 |
3 | 4 |
zip 함수로 새로 쌓고 배열끼리 더하기 (오른쪽으로 회전한 상태)
3 | 1 |
4 | 2 |
주의할 점: 현재 4*4 2차원 배열 2개를 zip함수로 튜플로 묶고 또 배열로 묶은 상태이다.
- 리스트(튜플((배열4*4)+(배열4*4)))
그래서 2차원 배열로 만들어주기 위해서 튜플[0] + 튜플[1]을 합쳐서 리스트로 바꾸면 된다.
arr = list(map(lambda x: x[0]+x[1], arr))