문제 : 백준 1138 한 줄로 서기 👥
난이도 : 실버 2
1️⃣ N명의 사람들은 매일 아침 한 줄로 선다.
2️⃣ 이때, 사람들은 자기보다 큰 사람이 왼쪽에 몇 명 있었는지만을 기억한다.
3️⃣ N명의 사람이 있고, 사람들의 키는 1부터 N까지 모두 다르다.
4️⃣ 각 사람들이 기억하는 정보가 주어질 때, 줄을 어떻게 서야 하는지 출력한다.
☝️ 이때 고민하다가, 앞에서부터 고려하는 것이 아닌 마지막부터 고려해야겠다는 생각이 들었다!
마지막 키부터 어디에 위치할지를 정한다.
그 다음 키는 왼쪽 사람의 수가 얼마있는지에 따라서 위치가 정해진다.
1️⃣ 키가 4인 사람(N번째 사람) : 가장 크기 때문에 자신보다 큰 사람이 없어서 왼쪽 사람의 수는 0이 될 수 밖에 없다.
2️⃣ 키가 3인 사람 : 왼쪽 사람의 수가 1이므로 자신보다 큰 사람은 4밖에 없어서 4의 바로 뒤에 위치하게 된다.
3️⃣ 키가 2인 사람 : 왼쪽 사람의 수가 1이므로 자신보다 큰 사람이 1명이어야 하므로 4와 3 사이에 위치하게 된다.
4️⃣ 키가 1인 사람 : 왼쪽 사람의 수가 2이므로 4,2와 3 사이에 들어가게 된다.
✨ 즉, 해당 키를 삽입할 위치는 이미 구해진 배열에서 왼쪽 사람의 수번째에 들어간다!!
#include <iostream>
#include <vector>
using namespace std;
int main(){
ios_base::sync_with_stdio(false);
cin.tie(NULL); cout.tie(NULL);
int N = 0;
int people[11];
vector<int> lines;
cin>>N;
for(int i=1; i<=N; i++){
cin>>people[i];
}
lines.push_back(N);
for(int i=N-1; i>=1; i--){
lines.insert(lines.begin()+people[i], i);
}
for(int ans : lines){
cout<<ans<<" ";
}
}
1️⃣ 키를 거꾸로 살펴보아야 하기 때문에 배열에 저장해 놓는다.
2️⃣ 이때, 가장 중요한 점은 vector<int>lines
에 lines.insert(lines.begin()+people[i], i)
를 한다는 점이다.