46 lines
1.5 KiB
Python
46 lines
1.5 KiB
Python
# 줄세우기
|
|
|
|
import sys
|
|
|
|
input = sys.stdin.readline
|
|
|
|
def test(students):
|
|
line = [float('inf')] * 20
|
|
count = 0
|
|
|
|
for i, s in enumerate(students):
|
|
now_idx = 0
|
|
while 1:
|
|
if line[now_idx] > s:
|
|
break
|
|
now_idx += 1
|
|
for j in range(i-1, now_idx-1, -1):
|
|
line[j+1] = line[j]
|
|
count += 1
|
|
line[now_idx] = s
|
|
|
|
return count
|
|
|
|
def solution():
|
|
p = int(input().rstrip())
|
|
|
|
for _ in range(p):
|
|
test_case = list(map(int, input().rstrip().split()))
|
|
print(test_case[0], test(test_case[1:]))
|
|
return
|
|
|
|
solution()
|
|
|
|
"""
|
|
걸린 시간: 33분
|
|
|
|
시간 복잡도: 새로운 학생이 line에 들어올때마다 원래 있던 모든 학생이 움직이는 경우가 최대이므로
|
|
학생 수를 n이라고 하면 학생 당 (n-1), (n-2),... 0 이므로 O(n^2)인데, 이 문제는 20명 고정이므로
|
|
19*20/2 = 190 이다.
|
|
|
|
해설: 기본 line을 float('inf')로 세팅함으로써 사람이 없는 경우는 맨 뒤에 두고 없는 사람 취급을 한다.
|
|
세팅 후 순서대로 한명씩 line에 넣는데 이때 나보다 큰 가장 앞에 있는 사람을 찾아야 하기 때문에
|
|
그냥 맨 처음부터 보다가 나보다 큰 사람이 있으면 그 index에 내가 서고, 뒤에 있는 사람들을
|
|
한 칸씩 뒤로 밀면 된다. 뒤로 밀때는 지금까지 line에 있는 사람 수에서 내가 들어가야할 index까지
|
|
거꾸로 오면서 한 칸씩 뒤로 밀면 된다. 이때 count+1을 해주고 결과값 count를 반환하고 출력.
|
|
""" |