Algorithm/Implementation
[백준 10431 / Python / 실버5] 줄세우기
양선규
2025. 6. 18. 20:05
728x90
반응형

구현, 정렬, 시뮬레이션 문제이다. 모든 학생이 각자 물러선 총 횟수를 구해야 한다.
import sys
input = sys.stdin.readline
def binary_search(child, arr):
start = 0
end = len(arr) - 1
result = len(arr)
while start <= end:
mid = (start + end) // 2
if arr[mid] > child:
result = mid
end = mid - 1
else:
start = mid + 1
return len(arr) - result
P = int(input())
for _ in range(P):
number, *children = map(int, input().split())
result = 0
standing = [children[0]]
for i in range(1, len(children)):
count = binary_search(children[i], standing)
result += count
idx = len(standing) - count
standing.insert(idx, children[i])
print(number, result)
해결 방법은 문제 내용을 그대로 구현하면 된다.
주어진 순서대로 아이들을 줄세우되, 아이가 추가될 때마다 뒤쪽 아이들이 뒷걸음 하는 횟수를 전부 더하면 된다.
이 때, 아이가 어떤 위치에 끼어들어야 하는가? 를 구하기 위해 이분 탐색을 활용했다. binary_search 함수는 뒷걸음 하는 횟수를 리턴하는 함수이다.
줄 길이 - 끼어든 인덱스 -> 뒷걸음 하는 아이의 수
줄 길이 - 뒷걸음 하는 아이의 수 -> 끼어든 인덱스
이것을 참고해서 구현하면 되겠다.
끼어들 좌표를 구한 후, 실제로 끼어들도록 insert 해주는 작업도 잊어선 안된다.
728x90
반응형