알고리즘
백준 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 << " ";
}
}