문제
https://www.acmicpc.net/problem/1377
1377번: 버블 소트
첫째 줄에 N이 주어진다. N은 500,000보다 작거나 같은 자연수이다. 둘째 줄부터 N개의 줄에 A[1]부터 A[N]까지 하나씩 주어진다. A에 들어있는 수는 1,000,000보다 작거나 같은 자연수 또는 0이다.
www.acmicpc.net
풀이
1. sort() 함수로 배열 정렬 ⇒ 시간 복잡도 O(nlogn)
2. 데이터의 정렬 전 index와 정렬 후 index를 비교해 왼쪽으로 가장 많이 이동한 값을 찾는다.
⇒ 정렬 전 index - 정렬 후 index의 최댓값 + 1
* 1 : swap이 일어나지 않는 반복문이 한 번 더 실행되는 것을 감안
정렬(Sort) 알고리즘
정렬(Sort) 알고리즘 데이터를 정해진 기준에 따라 순서대로 나열해 의미 있는 구조로 재설정하는 것 버블(Bubble) 정렬 알고리즘 데이터의 인접 요소끼리 비교하고, swap 연산을 수행하며 정렬하는
soobin0821.tistory.com
코드
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int N; // 데이터 개수
cin >> N;
vector<pair<int, int>> A(N); // 데이터 저장 배열
// 배열 A 저장
for(int i = 0; i < N; i++)
{
cin >> A[i].first;
A[i].second = i;
}
sort(A.begin(), A.end()); // 배열 A 정렬 시간 복잡도 : O(nlogn)
int max = 0;
for(int i = 0; i < N; i++)
{
// 정렬 전 index - 정렬 후 index를 계산한 값 중 최댓값을 찾아 저장
if(A[i].second - i > max)
{
max = A[i].second - i;
}
}
cout << max + 1; // 최댓값 + 1을 정답으로 출력
return 0;
}
오답
안 쪽 for 문은 1 ~ (n - j)까지, 즉 왼쪽에서 오른쪽으로 이동하면서 swap 수행
⇒ 데이터의 정렬 전 index와 정렬 후 index를 비교해 왼쪽으로 가장 많이 이동한 값을 찾는다.
더보기
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int N;
cin >> N;
vector<pair<int, int>> A(N);
for(int i = 0; i < N; i++)
{
cin >> A[i].first;
A[i].second = i;
}
sort(A.begin(), A.end()); // 배열 A 정렬 시간 복잡도 : O(nlogn)
int Max = 0;
for(int i = 0; i < N; i++)
{
// 정렬 전 index - 정렬 후 index를 계산한 값 중 최댓값을 찾아 저장
if(Max < A[i].second - i)
{
Max = A[i].second - i;
}
}
cout << Max + 1 << endl;
}
728x90
'코딩테스트 > 백준' 카테고리의 다른 글
[백준][C++]1722번 순열의 순서 (0) | 2023.10.12 |
---|---|
[백준][C++]1328번 고층 빌딩 (0) | 2023.10.12 |
[백준][C++]13251번 조약돌 꺼내기 (0) | 2023.10.10 |
[백준][C++]1256번 사전 (2) | 2023.10.06 |
[백준][C++]1948번 임계경로 (0) | 2023.09.22 |