====== 버블 소트 ====== ===== 풀이 ===== * 말을 살짝 꼬아놨지만 결국은 [[ps:Inversion Counting|Inversion의 갯수를 세는 문제]] * [[ps:Inversion Counting]]에서 설명했듯, 머지소트에 기반한 방식과 Order Statistic Tree에 기반한 방식으로 풀 수 있다. * 문제가 여기에서 조금 확장되면 머지소트을 사용하는 방법은 적용하기가 어렵거나 속도가 느리거나 하지만, 이 문제에서만은 머지소트 방법이 더 빠르게 동작했다. * 그래서 두가지 코드를 모두 적었다. 시간 복잡도는 둘 다 O(nlogn). ===== 코드 ===== ==== 코드 1 - 머지소트 ==== """Solution code for "BOJ 1517. 버블 소트". - Problem link: https://www.acmicpc.net/problem/1517 - Solution link: http://www.teferi.net/ps/problems/boj/1517 """ def sort_and_count_inversion(list_): if len(list_) <= 1: return 0 mid = len(list_) // 2 left, right = list_[:mid], list_[mid:] inversion_count = (sort_and_count_inversion(left) + sort_and_count_inversion(right)) l_size, r_size = mid, len(right) i = j = 0 ret = [] while True: try: if left[i] <= right[j]: ret.append(left[i]) i += 1 else: ret.append(right[j]) j += 1 inversion_count += l_size - i except IndexError: break list_[:] = ret list_.extend(left[i:]) list_.extend(right[j:]) return inversion_count def main(): N = int(input()) A = [int(x) for x in input().split()] print(sort_and_count_inversion(A)) if __name__ == '__main__': main() ==== 코드 2 - Order Statistic Tree ==== """Solution code for "BOJ 1517. 버블 소트". - Problem link: https://www.acmicpc.net/problem/1517 - Solution link: http://www.teferi.net/ps/problems/boj/1517 """ from teflib import fenwicktree def main(): N = int(input()) A = [int(x) for x in input().split()] compress_map = {x: i for i, x in enumerate(sorted(set(A)))} comp_a = [compress_map[x] for x in A] ost = fenwicktree.OrderStatisticTree(len(compress_map)) answer = 0 for a_i in reversed(comp_a): answer += ost.count_less_than(a_i) ost.add(a_i) print(answer) if __name__ == '__main__': main() * Dependency: [[:ps:teflib:fenwicktree#OrderStatisticTree|teflib.fenwicktree.OrderStatisticTree]] {{tag>BOJ ps:problems:boj:골드_1}}