https://www.acmicpc.net/problem/11399
해당 문제는 삽입정렬 알고리즘을 활용하는 문제이다.
삽입 정렬?
이미 정렬된 데이터 범위에 정렬되지 않은 데이터를 적절한 위치에 삽입해 정렬하는 방식.
시간 복잡도 : O(N^2)
느린 편이지만 구현하기가 쉽다.
삽입 정렬 과정
- 현재 index에 있는 데이터 값을 선택
- 현재 선택한 데이터가 정렬된 데이터 범위에 삽입될 위치를 탐색한다.
- 삽입 위치부터 index에 있는 위치까지 shift연산을 수행한다.
- 삽입 위치에 현재 선택한 데이터를 삽입하고 index++ 연산을 수행
- 전체 데이터의 크기만큼 index가 커질 때까지, 즉 선택할 데이터가 없을 때까지 반복
적절한 삽입 위치 탐색은 '이진 탐색'과 같은 탐색 알고리즘을 사용하면 시간 복잡도를 줄일 수 있음
이런 특징을 가지고 있다.
해당 문제는 굳이 삽입 정렬을 사용하지 않아도 풀이할 수 있으며, 나는 총 3개의 풀이로 풀었다.
첫번째 : 진짜 삽입 정렬
#include <bits/stdc++.h>
using namespace std;
int main()
{
ios::sync_with_stdio(0);
cin.tie(0), cout.tie(0);
int n;
cin >> n;
vector<int> v(n);
vector<int> s(n, 0);
for (int i = 0; i < n; i++)
{
cin >> v[i];
}
for (int i = 1; i < n; i++)
{
int insert = i;
int val = v[i];
for (int j = i - 1; j >= 0; j--)
{
/* code */
if (v[i] > v[j])
{
insert = j + 1;
break;
}
if (j == 0)
{
insert = 0;
}
}
for (int j = i; j > insert; j--)
{
v[j] = v[j - 1];
}
v[insert] = val;
}
s[0] = v[0];
for (int i = 1; i < n; i++)
{
s[i] = s[i - 1] + v[i];
}
int rst = 0;
for (int i = 0; i < n; i++)
{
rst += s[i];
}
cout << rst;
}
순서는 다음과 같다.
- 삽입할 포인트 찾기
- 포인트를 기준으로 요소들 밀기
- 포인트에 현재 요소 삽입
음.. 순서를 이해하기 어렵게 대충쓴거 같은데, 그냥 다시 읽다보면 쉽게 이해할 수 있는 수준의 알고리즘이므로 그냥 패스하겠다.
두번째 : 삽입 정렬이긴한데,, 버블 정렬과 합쳐진 느낌의 풀이
#include <bits/stdc++.h>
using namespace std;
int main()
{
ios::sync_with_stdio(0);
cin.tie(0), cout.tie(0);
int n;
cin >> n;
vector<int> v(n);
for (int i = 0; i < n; i++)
{
cin >> v[i];
}
for (int i = 1; i < n; i++)
{
int idx = i;
for (int j = i - 1; j >= 0; j--)
{
/* code */
if (v[idx] < v[j])
{
int tmp = v[idx];
v[idx] = v[j];
v[j] = tmp;
idx--;
}
else
{
break;
}
}
}
vector<int> s(n, 0);
s[0] = v[0];
for (int i = 1; i < n; i++)
{
s[i] = s[i - 1] + v[i];
}
int rst = 0;
for (int i = 0; i < n; i++)
{
rst += s[i];
}
cout << rst;
}
그냥 이 코드는 현재 요소의 바로 앞 요소가 본인보다 크면 바로 swap하는 코드다.
그렇지 않다면 break
세번째 : sort활용
// ATM
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int main()
{
int n, rst = 0;
cin >> n;
vector<int> arr(n);
for (int i = 0; i < n; i++)
{
cin >> arr[i];
}
sort(arr.begin(), arr.end());
int turn = 0;
while (n != turn)
{
rst += arr[turn] * (n - turn++);
}
cout << rst;
}
해당 방식은 문제을 읽어보니, 그냥 오름 차순 정렬을 하면 끝나는 문제라 그냥 sort함수써서 끝냈음.
이 문제는 삽입 정렬을 위해 풀고 싶었기 때문에, 여러가지 방법으로 시도해보게 되었다.
728x90
'백준이당' 카테고리의 다른 글
[C++] 백준 14916번 : 거스름돈 (0) | 2025.03.21 |
---|---|
[C++] 백준 20055번 : 컨베이어 벨트 위의 로봇 (0) | 2025.03.21 |
[python, C++] 백준 9663 : N-queen (0) | 2024.05.16 |
[C++] 백준 9095 : 1,2,3 더하기 (0) | 2024.04.11 |
[C++] 백준 15650 : N과 M(2) (1) | 2024.03.26 |