넘치게 채우기
[BOJ] 1838 - 버블 정렬 본문
https://www.acmicpc.net/problem/1838
BOJ - 버블 정렬
문제 유형: 정렬
문제 난이도: Gold I
시간 제한: 1초
메모리 제한: 128MB
문제
버블 정렬이란 배열에서 서로 인접해 있는 값을 비교해서 작은 값이 더 뒤에 있을 때 두 값을 바꾸어 주는 과정을 계속 반복하는 정렬 방법이다. N개의 서로 다른 정수가 A[0], A[1], ..., A[N-1]의 정수형 배열에 저장되어 있고, 이를 오름차순으로 정렬하기 위해 태국이는 다음과 같은 코드를 작성하였다.
for (i=0; i<N; i++) {
flag = 0;
for (j=0; j<N-1; j++) {
if (A[j] > A[j+1]) {
flag = 1;
temp = A[j];
A[j] = A[j+1];
A[j+1] = temp;
}
}
}
하지만 주어진 배열 A에 따라 변수 i가 모든 loop를 반복하지 않아도 정렬이 완료되기도 한다. 따라서 도현이는 다음과 같이 코드를 개선하였다.
for (i=0; i<N; i++) {
flag = 0;
for (j=0; j<N-1; j++) {
if (A[j] > A[j+1]) {
flag = 1;
temp = A[j];
A[j] = A[j+1];
A[j+1] = temp;
}
}
if (flag == 0) {
break;
}
}
도현이는 자신이 태국이보다 우월하다는 것을 증명하기 위해, 개선된 코드를 이용하여 주어진 배열 A를 정렬해 보려고 한다. 만일 정렬이 완료되었을 때(즉 for문을 빠져나왔을 때)의 i값이 작으면 작을수록 도현이의 코드가 더 빠른 것이 된다. 태국이를 이기고 싶은 도현이를 도와서, 배열 A에 저장된 수가 주어지면 정렬이 완료되었을 때 변수 i에 저장되어 있는 값을 구하는 프로그램을 작성하시오.
입력
첫째 줄에는 정수 N(1 ≤ N ≤ 500,000)이 주어진다. 다음 줄에 배열 A를 이루는 N개의 정수가 빈 칸을 사이에 두고 순서대로 주어진다. 주어지는 정수는 절댓값이 2,147,483,647을 넘지 않는다.
출력
첫째 줄에 정렬이 완료되었을 때 변수 i에 저장되어 있는 값을 출력한다.
풀이

왼쪽 그림부터 보자. 0번째 반복에서 10과 27이 한 번씩 역전당하고, 30과 44는 한 번씩 역전한다.
1번째 반복에서는 27이 한 번 역전당하고, 30은 한 번 역전한다.
이렇게 두 번의 반복에 정렬이 종료되었다.
정렬된 위치의 인덱스와 기존 인덱스의 최대 차이(갭)이 정답이다.
{숫자, 기존인덱스}로 묶어서 오름차순정렬 후, 가장 큰 인덱스차를 구해주면 된다.
코드
C++
#include <bits/stdc++.h>
using namespace std;
int main(int argc, char *argv[]) {
ios_base::sync_with_stdio(0);
cin.tie(0);
int n;
cin >> n;
vector<pair<int, int>> pa(n);
for (int i = 0; i < n; i++) {
int a;
cin >> a;
pa[i] = {a, i};
}
sort(pa.begin(), pa.end());
int ans = 0;
for (int i = 0; i < n; i++) {
ans = max(ans, abs(pa[i].second - i));
}
cout << ans << "\n";
return 0;
}'PS > BOJ' 카테고리의 다른 글
| [BOJ] 23880 - Walking Home (0) | 2025.04.28 |
|---|---|
| [BOJ] 2262 - 토너먼트 만들기 (0) | 2025.04.27 |
| [BOJ] 11727 - 2xn 타일링 2 (0) | 2025.04.26 |
| [BOJ] 14169 - Lasers and Mirrors (0) | 2025.04.24 |
| [BOJ] 13976 - 타일 채우기 2 (0) | 2025.04.23 |