diff --git a/workbook_8708/10431-s5.py b/workbook_8708/10431-s5.py new file mode 100644 index 0000000..8062be6 --- /dev/null +++ b/workbook_8708/10431-s5.py @@ -0,0 +1,46 @@ +# 줄세우기 + +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를 반환하고 출력. +""" \ No newline at end of file