BIT를 이용한 역전쌍
순서가 어긋난 쌍을 효율적으로 셉니다
BIT를 이용한 역전쌍은(는) CoddyKit의 무료 Coding Interview Prep 강의입니다. 이것은 4개 중 2번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Coding Interview Prep 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Coding Interview Prep 강의에는 총 4개의 강의가 포함되어 있습니다.
역순쌍이란 무엇인가
역순쌍은 a[i] > a[j]를 만족하는 i < j인 쌍입니다. 순서가 뒤바뀐 하나의 쌍이며, 배열이 얼마나 정렬되지 않았는지를 측정합니다.
역순쌍이 중요한 이유
역순쌍의 개수는 버블 sort가 수행할 교환 횟수와 같습니다. 대회 문제에서는 이를 순위나 뒤섞임에 관한 질문 속에 숨겨 두기도 합니다.
순진한 계산은 너무 느립니다
모든 쌍을 확인하면 O(n^2)입니다. n이 약 100000이면 100억 번을 확인해야 하므로 시간 제한을 훨씬 넘습니다. 더 영리한 방법이 필요합니다. 🐢
BIT 아이디어
왼쪽에서 오른쪽으로 훑으며 현재 원소보다 앞에 있는 원소 중 더 큰 원소가 몇 개인지 묻습니다. 펜윅 트리가 이 값을 진행하면서 계산해 줍니다.
빈도로 세기
BIT는 값 전체에 대한 빈도 표를 저장합니다. 갱신(v, 1)은 지금까지 훑은 부분에 값 v가 등장했다는 사실을 기록합니다.
update(v, 1)더 크다는 것은 접미사라는 뜻
v보다 큰 앞쪽 값의 개수는 지금까지 본 원소 수에서 v 이하의 원소 수를 뺀 값입니다. i번째 원소에서는 i - 질의(v)로 계산합니다.
inv += i - query(v)좌표 압축
값이 크거나 음수라면 먼저 순위 1..n으로 매핑하십시오. 이 압축은 순서를 바꾸지 않으면서 BIT의 크기를 작게 유지합니다.
rank = {v: i for i, v in enumerate(sorted(set(a)), 1)}전체 훑기
배열을 순회하면서 각 원소보다 큰 값의 개수를 전체 합에 더한 다음 현재 값을 삽입합니다. 실행 중인 전체 합이 역순쌍의 개수가 됩니다.
for i, v in enumerate(a):
inv += i - query(rank[v])
update(rank[v], 1)n log n에 실행하기
각 원소마다 질의 한 번과 갱신 한 번을 수행하며, 둘 다 O(log n)입니다. 따라서 전체 계산은 O(n log n) 시간에 끝납니다. 🚀
병합 sort라는 친척
병합 sort도 병합 단계에서 O(n log n)에 역순쌍을 셉니다. BIT를 사용하는 방법은 시간에 쫓길 때 작성하기 더 짧은 경우가 많습니다.
개수의 오버플로 주의하기
역순쌍의 개수는 n²/2 정도까지 커질 수 있어 매우 큽니다. 파이썬의 정수는 제한이 없지만, 다른 언어에서는 64비트 자료형이 필요합니다.
빠른 확인
훑기에 필요한 비용을 제대로 이해했는지 확인해 보십시오.
복습: 뒤섞임 세기
왼쪽에서 오른쪽으로 훑으면서 BIT에 앞에 나온 더 큰 값이 몇 개인지 물어 O(n log n)에 역순쌍을 셌습니다. 필요할 때는 값을 압축하십시오. ✅
자주 묻는 질문
“BIT를 이용한 역전쌍” 강의는 무료인가요?
네 — “BIT를 이용한 역전쌍” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Coding Interview Prep 강의 전체를 잠금 해제할 수 있습니다. Coding Interview Prep 강의에는 총 4개의 강의가 포함되어 있습니다.
“BIT를 이용한 역전쌍”에서 뭘 배우나요?
순서가 어긋난 쌍을 효율적으로 셉니다 브라우저에서 직접 실행하는 실습 코드로 Coding Interview Prep을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
Coding Interview Prep을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 Coding Interview Prep은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 2번째 강의입니다.
“BIT를 이용한 역전쌍” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 Coding Interview Prep 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 Coding Interview Prep 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- 누적 합을 위한 펜윅 트리
- BIT를 이용한 역전쌍
- 세그먼트 트리: 구축과 질의
- 구간 갱신을 위한 지연 전파