[λ°±μ€(BOJ)] νμ€ν κ·Έλ¨(1725) C++
λ¬Έμ : BOJ_1725λ² νμ€ν κ·Έλ¨
λ¬Έμ μ€λͺ
λΆν μ 볡
μ λͺ
ν λΆν μ 볡 λ¬Έμ μ
λλ€.
μ€ν
μ νμ©νμ¬ O(N)
μμ νΈλ λ°©λ²λ μ‘΄μ¬νλ€κ³ λ€μμΌλ, λΆν μ 볡μ μ΄μ©ν΄ νμ΄λ΄€μ΅λλ€.
μμμ ν¬κΈ°λ₯Ό κ°μ§ κ°κ²©μ΄ 1μΈ λ§λ 그리νλ€μ΄ λμ΄μ Έμκ³ , λ΄λΆμμ κ°μ₯ ν° λμ΄λ₯Ό ꡬν΄μΌ νλλ°
μ΄λ, λ§λκ·Έλνλ μ°μν λ§λκ·Έλνλ₯Ό μ νν΄μΌ νκ³ , λμ΄ κ°μ μ νλ λ§λκ·Έλνλ€ μ€ μ΅μ λμ΄, κ°κ²©μ λ§λκ·Έλν νλμ κ°κ²©μ΄ 1μ΄λ―λ‘, λ§λκ·Έλνμ κ°μμ
λλ€.
Solution
λ§λκ·Έλνλ€μ κ³μ μ λ°μ© λλ μ κ°κ° λλ μ§ μ λ°λ§λ€μ κ²½μ°μμ μ΅λ ν¬κΈ°λ₯Ό ꡬν΄μΌ ν©λλ€.
μ΄λ, μ΅λ ν¬κΈ°λ μ²μμ λ§λκ·Έλνλ₯Ό μ€μμ κΈ°μ€μΌλ‘ μ‘κ³ , λμ΄κ° ν° μͺ½(κ°μ μͺ½μ΄λ©΄ μ무 λ°λ)μΌλ‘ νμ₯ν΄λκ°λ©°,
νμ₯ν λͺ¨λ κ²½μ°μ μλ§λ€ λμ΄μ μ΅λκ°μ κ°±μ ν΄ μ£Όλ©° λͺ¨λ λ§λκ·Έλν μ 체λ₯Ό νμ₯νλ©΄ λΆν λ ꡬμμμ μ΅λκ°μ΄ 보μ₯λ©λλ€.
μ΄λ, λ§λκ·Έλνλ₯Ό ν λ²μ©λ§ νμ₯ν΄ μ£Όλ―λ‘ λΆν λ μνμμ μ 체 λ§λκ·Έλνλ₯Ό νμνλ κ²μ N
λ²μ΄κ³ ,
μ 체 ν¬κΈ°λ₯Ό κ³μ μ λ° μ© λλκΈ° λλ¬Έμ μ 체 κ°μκ° Nμ΄λΌλ©΄, Nμ΄ 1μ΄ λ λκΉμ§ κ³μ 2λ‘ λλμ΄ μ§νν΄μΌ νλ―λ‘,
μκ° λ³΅μ‘λλ O(logN * N)
μμ μ μ μμ΅λλ€.
Description
ꡬνμ΄ λ³΅μ‘νλ―λ‘, λ κ°μ ν¨μλ‘ λλ μ νμ΄μ€¬μ΅λλ€.
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
int N, value[100002], area;
int printArea(int funcLeft, int funcRight);
void recursion(int le, int ri);
int main(void) {
memset(value, -1, sizeof(value));
cin >> N;
for (int i = 1; i <= N; i++) {
cin >> value[i];
}
recursion(1, N);
cout << area << '\n';
return 0;
}
void recursion(int le, int ri) {
// μ λ° μ© λΆν νλ μ¬κ· ν¨μ
if (le == ri) {
area = max(area, value[le]);
return;
}
area = max(area, printArea(le, ri));
int mid = (le+ri)/2;
if ((ri - le) == 1) {
area = max(area, value[ri]);
return;
}
recursion(le, mid);
recursion(mid, ri);
}
int printArea(int funcLeft, int funcRight) {
// λΆν λ λ§λ κ·Έλνλ€ μ€ μ΅λ λμ΄λ₯Ό ꡬν΄μ£Όλ ν¨μ
int returnArea = 0;
int cnt = 1;
int mid = (funcRight + funcLeft) / 2;
int le = mid;
int ri = mid;
int nowHeight = value[mid];
bool endLe = false;
bool endRi = false;
while (true) {
if (le <= funcLeft && ri >= funcRight) break;
if (le == funcLeft) endLe = true;
if (ri >= funcRight) endRi = true;
cnt++;
int nowArea;
if (endLe) {
ri++;
nowHeight = min(value[ri], nowHeight);
}
else if (endRi) {
le--;
nowHeight = min(value[le], nowHeight);
}
else if ((value[le - 1] >= value[ri + 1]) && !endLe) {
le--;
nowHeight = min(value[le], nowHeight);
}
else {
ri++;
nowHeight = min(value[ri], nowHeight);
}
nowArea = cnt * nowHeight;
returnArea = max(returnArea, nowArea);
}
return returnArea;
}
'Algorithm > BOJ' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[BOJ] ν΄λν° μν(5070) (0) | 2022.03.07 |
---|---|
[BOJ] μ νλ²νΈ λͺ©λ‘(5052) (0) | 2022.03.07 |
[BOJ] κ³±μ (1629) (0) | 2022.03.06 |
[BOJ] νμμ€λ°°μ (1931) (0) | 2022.03.06 |
[BOJ] μ«μ μΌκ΅¬(2503) (0) | 2022.03.06 |