728x90
개요
문제 링크
실버 1, Greedy
삭제 후 삽입 실행 시 비내림차순이 되는 최소 실행 수
접근
- 너무 어렵게 구현한 것 같은데 일단 이렇게 했음.
1) 우선 핵심은 작은 수부터 뽑는다.
2) 그런데 작은 수가 여러개면 가장 뒤의 것을 뽑는다.
3) 만약 뽑은 수가 이전 수보다 더 크고 앞에 있다면 그 수부터 끝까지 뽑는다. - 뭔 소린가 하니,
32345 -> 23453 -> 23534 -> 23345 (3번)
32345 -> 3M345 -> 3MM45 -> 3개 뽑음
a[1] -> a[2] -> a[0] 에서 걸리므로 a[0], a[3], a[4]를 뽑아주는 것이다. 뽑아줬다는 표시를 위해 뽑은 수는 2e9로 초기화한다.
- 추가로 아래 케이스를 보자.
3223223 -> 3222233 -> 2222333 (2번)
3223223 -> 32232M3 -> 3223MM3 -> 32M3MM3
-> 3MM3MM3 -> 3MM3MMM -> 2개 뽑음
이렇게 해줘야 같은 수가 있을 때를 잘 고려할 수 있다.
Pseudo code
이전 = 0
for (유효횟수 = n번 동안)
현재 = 가장작은수
// 여러개면 가장 뒤의 수 중 이전보다 뒤에 있는 것
if (현재 < 이전)
break
이전 = 현재
최대실행 = n - 유효횟수
// 만약 유효 = n이면 모두 유효하므로 0개 삭삽
// 만약 유효 = 0이면 모두 유효하지 않으므로 n개 삭삽
Source code
#include <bits/stdc++.h>
using namespace std;
void test() {
int k, n;
cin >> k >> n;
int a[n+1];
for (int i=1; i<=n; i++)
cin >> a[i];
a[0] = 2e9;
int h = 0;
int i;
for (i=0; i<n; i++) {
int m = 0;
for (int j=n; j>=1; j--)
if (a[j] < a[m])
m = j;
else if (a[j]==a[m])
if (j > h)
m = j;
if (m < h)
break;
h = m;
a[m] = 2e9;
}
cout << k << " " << n-i << "\n";
}
int main() {
int t;
cin >> t;
while (t--) test();
}
728x90
'백준브실골 > Greedy' 카테고리의 다른 글
백준 2812, 크게 만들기 (0) | 2023.02.11 |
---|---|
백준 1132, 합 (0) | 2023.02.11 |
백준 1339, 단어 수학 (0) | 2023.02.11 |
백준 12237, Up and Down (Large) (0) | 2023.02.09 |
백준 4889, 안정적인 문자열 (0) | 2023.02.08 |
백준 9009, 피보나치 (0) | 2023.02.08 |
백준 25683, 행렬 곱셈 순서 4 (0) | 2023.02.08 |
백준 14926, Not Equal (0) | 2023.02.08 |
댓글