Files
baekjoon-study/workbook_8708/silver/10431-s5.py
2026-02-23 11:14:50 +09:00

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를 반환하고 출력.
"""