21131. 행렬정렬 (SWEA)
※ SW Expert 아카데미의 문제를 무단 복제하는 것을 금지합니다.
출처:
나의 풀이
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
T = int(input())
for test_case in range(1, T + 1):
N=int(input())
matrix=[]
for _ in range(N):
matrix.append(list(map(int,input().strip().split())))
swap=0
count=0
for i in range(N-1,0,-1):
if matrix[i][i-1]>matrix[i-1][i]:
if swap%2!=0:
swap+=1
count+=1
else:
if swap%2==0:
swap+=1
count+=1
print(count)
- 문제에서 중요한 전제 조건은 ‘정렬 가능한’ 이다.
- transpose로 무조건 정렬이 가능하도록 행렬이 들어온다는 것이다. 따라서 x가 가장 큰 구간부터 조건에 만족하도록 transpose를 취하면 된다.
- diagonal을 기준으로 아래 행렬의 원소가 더 크기 때문에, 쌍을 이루는 2개의 원소만 비교해서 조건에 만족하지 않으면 tanspose했다고 가정한다.
- 이때 x크기의 행렬을 transpose하면 1~x-1 행과 열의 원소도 영향을 받기 때문에 swap의 횟수에 따라 x-1, x-2…에서 transpose할지 하지 않을지를 결정한다. (x-2에서 원래의 행렬은 transpose가 필요한데, 이미 x-1에서 transpose되었다면 할 필요가 없기 때문)
This post is licensed under CC BY 4.0 by the author.