본문 바로가기
백준브실골/Greedy

백준 13884, 삭삽 정렬

by oculis 2023. 2. 8.

내 옆의 개발자, LINT 를 오픈하였습니다.

웹사이트가 필요하면 언제든 연락주세요.

주식 가격을 예측하고 랭크를 올리는 커뮤니티, 오떨 을 오픈하였습니다.

지금 접속하고 예측을 시작해보세요.

728x90

개요

문제 링크
실버 1, Greedy
삭제 후 삽입 실행 시 비내림차순이 되는 최소 실행 수


접근

  1. 너무 어렵게 구현한 것 같은데 일단 이렇게 했음.
    1) 우선 핵심은 작은 수부터 뽑는다.
    2) 그런데 작은 수가 여러개면 가장 뒤의 것을 뽑는다.
    3) 만약 뽑은 수가 이전 수보다 더 크고 앞에 있다면 그 수부터 끝까지 뽑는다.
  2. 뭔 소린가 하니,
32345 -> 23453 -> 23534 -> 23345 (3번)
32345 -> 3M345 -> 3MM45 -> 3개 뽑음

a[1] -> a[2] -> a[0] 에서 걸리므로 a[0], a[3], a[4]를 뽑아주는 것이다. 뽑아줬다는 표시를 위해 뽑은 수는 2e9로 초기화한다.

  1. 추가로 아래 케이스를 보자.
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

댓글