1일1알

백준 1138번 한 줄로 서기 C++ 본문

알고리즘

백준 1138번 한 줄로 서기 C++

영춘권의달인 2023. 1. 19. 19:27

https://www.acmicpc.net/problem/1138

 

1138번: 한 줄로 서기

첫째 줄에 사람의 수 N이 주어진다. N은 10보다 작거나 같은 자연수이다. 둘째 줄에는 키가 1인 사람부터 차례대로 자기보다 키가 큰 사람이 왼쪽에 몇 명이 있었는지 주어진다. i번째 수는 0보다

www.acmicpc.net

 

처음에 작은순서대로 정렬되어있기때문에 앞에서부터 배치하면 후에 배치할 숫자는 무조건 지금 숫자보다 크고 이미 배치되어있는 숫자는 지금 숫자보다 작다. 

그렇기 때문에 처음 인덱스부터 자기보다 큰 사람의 수 + 지금까지 배치된 사람 수 만큼 이동해서 현재 숫자를 배치하면 된다.

 

#include <iostream>
#include <string>
#include <vector>
#include <math.h>
#include <algorithm>
#include <utility>
#include <stack>
#include <queue>
#include <math.h>
#include <set>
#include <map>
#include <list>
#include <unordered_map>
#include <unordered_set>
#include <iomanip>
#include <limits.h>

using namespace std;
using int64 = long long;

int n;
vector<int> v;
vector<int> ans;

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);

    cin >> n;
    v = vector<int>(n);
    ans = vector<int>(n, 0);
    for (int i = 0; i < n; i++) {
        cin >> v[i];
    }
    for (int i = 0; i < n; i++) {
        int cnt = 0;
        int targetCnt = v[i];
        for (int j = 0; j < n; j++) {
            if (cnt == targetCnt) {
                if (ans[j] != 0) continue;
                ans[j] = i + 1;
                break;
            }
            if (ans[j] == 0) cnt++;
        }
    }
    for (auto a : ans) {
        cout << a << " ";
    }
}