λ¬Έμ
KOI ν΅μ μ°κ΅¬μλ λ μ΄μ λ₯Ό μ΄μ©ν μλ‘μ΄ λΉλ° ν΅μ μμ€ν κ°λ°μ μν μ€νμ νκ³ μλ€. μ€νμ μνμ¬ μΌμ§μ μμ Nκ°μ λμ΄κ° μλ‘ λ€λ₯Έ νμ μν μ§μ μ μΌμͺ½λΆν° μ€λ₯Έμͺ½ λ°©ν₯μΌλ‘ μ°¨λ‘λ‘ μΈμ°κ³ , κ° νμ κΌλκΈ°μ λ μ΄μ μ‘μ κΈ°λ₯Ό μ€μΉνμλ€. λͺ¨λ νμ λ μ΄μ μ‘μ κΈ°λ λ μ΄μ μ νΈλ₯Ό μ§νλ©΄κ³Ό νννκ² μν μ§μ μ μΌμͺ½ λ°©ν₯μΌλ‘ λ°μ¬νκ³ , νμ κΈ°λ₯ λͺ¨λμλ λ μ΄μ μ νΈλ₯Ό μμ νλ μ₯μΉκ° μ€μΉλμ΄ μλ€. νλμ νμμ λ°μ¬λ λ μ΄μ μ νΈλ κ°μ₯ λ¨Όμ λ§λλ λ¨ νλμ νμμλ§ μμ μ΄ κ°λ₯νλ€.
μλ₯Ό λ€μ΄ λμ΄κ° 6, 9, 5, 7, 4μΈ λ€μ― κ°μ νμ΄ μν μ§μ μ μΌλ ¬λ‘ μ μκ³ , λͺ¨λ νμμλ μ£Όμ΄μ§ ν μμμ λ°λ λ°©ν₯(μΌμͺ½ λ°©ν₯)μΌλ‘ λμμ λ μ΄μ μ νΈλ₯Ό λ°μ¬νλ€κ³ νμ. κ·Έλ¬λ©΄, λμ΄κ° 4μΈ λ€μ― λ²μ§Έ νμμ λ°μ¬ν λ μ΄μ μ νΈλ λμ΄κ° 7μΈ λ€ λ²μ§Έ νμ΄ μμ μ νκ³ , λμ΄κ° 7μΈ λ€ λ²μ§Έ νμ μ νΈλ λμ΄κ° 9μΈ λ λ²μ§Έ νμ΄, λμ΄κ° 5μΈ μΈ λ²μ§Έ νμ μ νΈλ λμ΄κ° 9μΈ λ λ²μ§Έ νμ΄ μμ μ νλ€. λμ΄κ° 9μΈ λ λ²μ§Έ νκ³Ό λμ΄κ° 6μΈ μ²« λ²μ§Έ νμ΄ λ³΄λΈ λ μ΄μ μ νΈλ μ΄λ€ νμμλ μμ μ νμ§ λͺ»νλ€.
νλ€μ κ°μ Nκ³Ό νλ€μ λμ΄κ° μ£Όμ΄μ§ λ, κ°κ°μ νμμ λ°μ¬ν λ μ΄μ μ νΈλ₯Ό μ΄λ νμμ μμ νλμ§λ₯Ό μμλ΄λ νλ‘κ·Έλ¨μ μμ±νλΌ.
μ λ ₯
첫째 μ€μ νμ μλ₯Ό λνλ΄λ μ μ Nμ΄ μ£Όμ΄μ§λ€. Nμ 1 μ΄μ 500,000 μ΄νμ΄λ€. λμ§Έ μ€μλ Nκ°μ νλ€μ λμ΄κ° μ§μ μμ λμΈ μμλλ‘ νλμ λΉμΉΈμ μ¬μ΄μ λκ³ μ£Όμ΄μ§λ€. νλ€μ λμ΄λ 1 μ΄μ 100,000,000 μ΄νμ μ μμ΄λ€.
μΆλ ₯
첫째 μ€μ μ£Όμ΄μ§ νλ€μ μμλλ‘ κ°κ°μ νλ€μμ λ°μ¬ν λ μ΄μ μ νΈλ₯Ό μμ ν νλ€μ λ²νΈλ₯Ό νλμ λΉμΉΈμ μ¬μ΄μ λκ³ μΆλ ₯νλ€. λ§μ½ λ μ΄μ μ νΈλ₯Ό μμ νλ νμ΄ μ‘΄μ¬νμ§ μμΌλ©΄ 0μ μΆλ ₯νλ€.
λ¬Έμ νμ΄
μ²μμλ λ¨μν νλ²μ νλ€μ λμ΄λ₯Ό λ°κ³ , μ κ±°ν΄λκ°λ λ°©μμ μ¬μ©νλ€.
#include <iostream>
#include <stack>
using namespace std;
stack<pair<int, int>> s;
int arr[500000];
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
int n;
cin >> n;
for (int i = 0; i < n; i++) {
int tmp;
cin >> tmp;
s.push({ i,tmp }); // indexμ νμ λμ΄
}
for (int i = 0; i < n; i++) {
stack<pair<int, int>> cur_s = s;
while (cur_s.size() != (n - i)) {
cur_s.pop();
}
int prev_idx = cur_s.top().first;
int prev_value = cur_s.top().second;
cur_s.pop();
int result = 0;
while (!cur_s.empty()) {
if (cur_s.top().second > prev_value) {
result = cur_s.top().first; // ν΄λΉ νμ μΈλ±μ€
break;
}
cur_s.pop();
}
result == 0 ? arr[prev_idx] = 0 : arr[prev_idx] = result + 1;
}
for (int i = 0; i < n; i++) {
cout << arr[i] << " ";
}
}
pairλ₯Ό μ¬μ©ν΄ νμ μΈλ±μ€μ λμ΄λ₯Ό μ μ₯νκ³ (pair.first == μΈλ±μ€, pair.second == λμ΄)
κ°μ₯ μ€λ₯Έμͺ½(4)μ νλΆν° μ΄λμ μ νΈκ° λλ¬νλμ§ κ³μ°νλ€.
νμ§λ§, μ΄λ κ² νΈλ λ°©μμ λ¬Έμ λ 1. κ³μ stackμ 볡μ¬νκ³ 2. μκ°μ΄ μ€λκ±Έλ¦°λ€λ μ μ΄λ€.
μ¦ νμ΄ 6 9 5 7 4 μ΄λΌλ©΄, λμ΄ 4μ νμ΄ μ΄λμ λλ¬νλμ§ μ²΄ν¬νλ€.
λͺ¨λ νμ νμΈν λκΉμ§(s.empty()) λΉκ΅νλ ν(4)κ³Ό stackμ topμ λΉκ΅νλ€.
λΉκ΅νλ ν - 4 / stackμ top - 7 --> μ νΈκ° λλ¬νλ€.
(κ³μ stackμ 볡μ¬νλ€) κ·Έ λ€μμΌλ‘ stackμ 6 9 5 7 4 λ₯Ό 볡μ¬νκ³ 6 9 5 7 4λ₯Ό μ κ±°ν΄
λμ΄ 7μ νμ΄ μ΄λμ λλ¬νλμ§ μ²΄ν¬νλ€.
λΉκ΅νλ ν - 7 / stackμ top - 5 --> μ νΈκ° λλ¬νμ§ μλλ€ --> λ λμ νμ΄ μλμ§ νμΈνλ€.(s.pop())
λΉκ΅νλ ν - 7 / stackμ top - 9 --> μ νΈκ° λλ¬νλ€.
μ΄λ°μμΌλ‘ 맨 μ²μ νμΈ 6κΉμ§ μλ³Έ stack λ³΅μ¬ -> μ΄λ―Έ λΉκ΅ν νλ€ μ κ±° -> λΉκ΅ν ν μ ν -> stackμ topκ³Ό λΉκ΅
stackμ top λ³΄λ€ λΉκ΅νλ νμ΄ λλ€λ©΄ -> μ νΈ λλ¬ x -> λ λμ ν μλμ§ νμΈ
stackμ top μ΄ λΉκ΅νλ νλ³΄λ€ λλ€λ©΄ -> μ νΈ λλ¬ -> break
λ₯Ό λ°λ³΅νλ€.
νμ§λ§, μ΄λ κ² νλ©΄ μ λ ₯μ μκ° ν¬κΈ° λλ¬Έμ μκ°μ΄κ³Όλ₯Ό νΌν μ μλ€. κ·Έλμ ꡬκΈλ§μ ν΅ν΄ λ€λ₯Έ λ°©λ²μ κ³ μν΄λλ€. κ·Έ λ°©λ²μ λ€μ κ²μλ¬Όμμ μκ°νλλ‘ νκ² λ€.
(μ°Έκ³ : [2493] ν)