- λ¬Έμ μμ μ€λͺ
λ λλ‘ μ²«λ²μ§Έ μ λΆν° λΆμ΄μ§ μ΄νμΈ μ«μλ₯Ό κΈ°μ€μΌλ‘ λμΉ μμ κ³μ°ν΄μ λ€μμμ μ΄νμΈ μμ κ³μ°ν΄λκ°λ©΄ λλ€.
- κ³μ° μνκ³ ν μ μλ λ°©λ²μ΄ μλ κ³ λ―Όν΄λ΄€λλ° λ³λ‘ λ μ€λ₯΄λ λ°©λ²μ΄ μλκ² κ°λ€.
query_row = R
μ΄λΌκ³ ν λ ν΄λΉλλ rowμ μ΄νμΈ μμ μνλ₯Ό κ³μ°νλ €λ©΄ λ€μ rowκΉμ§ μμ΄μΌ νλ―λ‘ μ΄ (R + 1) * (R + 2) / 2
κ°μ μμ΄ νμνλ€.R + 1
rowμ μ΄νμΈ μμ μ€μ¬ λμ³€λ€κ³ νλλΌλ 쿼리 λμμ΄ μλλ―λ‘ κ΅³μ΄ κ³μ°ν νμκ° μλ€.
- μ΄λ€ μμ μμΈ μμ
G(r, c)
λΌκ³ ν λ G(r, c) β€ 1.0
μΈ κ²½μ°μλ λμΉμ§ μμμΌλ―λ‘ μ무 κ²λ νμ§ μλλ€.G(r, c) > 1.0
μΈ κ²½μ°μλ λμΉ μ G(r, c) - 1.0
μ λ°μΌλ‘ λλμ΄ κ°κ° κ·Έ μλμ μλ λ μ G(r + 1, c), G(r + 1, c + 1)
μ λΆλ°°νλ€.
class Solution {
public:
double champagneTower(int poured, int query_row, int query_glass) {
vector<double> glass((query_row + 2) * (query_row + 3) / 2);
glass[0] += poured;
int row_start = 0;
for (int row = 0; row <= query_row; ++row) {
bool found_excess = false;
int next_row_start = row_start + row + 1;
for (int col = 0; col <= row; ++col) {
double excess = glass[row_start + col] - 1.0;
if (excess <= 0.0) continue;
found_excess = true;
glass[next_row_start + col] += excess / 2.0;
glass[next_row_start + col + 1] += excess / 2.0;
glass[row_start + col] = 1.0;
}
if (!found_excess) break;
row_start = next_row_start;
}
row_start = query_row * (query_row + 1) / 2;
return glass[row_start + query_glass];
}
};
- λ©λͺ¨λ¦¬ 곡κ°μ μ’ λ μλΌκ³ μΆλ€λ©΄ μλμ²λΌ rowλ₯Ό 2κ° μ μνκ³ toggle νμ¬ μ¬μ©νλ λ°©λ²λ μλ€.
class Solution {
public:
double champagneTower(int poured, int query_row, int query_glass) {
vector<double> cur_row(query_row + 2);
vector<double> next_row(query_row + 2);
next_row[0] += poured;
int last_row = 0;
for (int row = 0; row <= query_row; ++row) {
cur_row.swap(next_row);
fill(next_row.begin(), next_row.begin() + row + 1, 0);
bool found_excess = false;
for (int col = 0; col <= row; ++col) {
double excess = cur_row[col] - 1.0;
if (excess <= 0.0) continue;
found_excess = true;
next_row[col] += excess / 2.0;
next_row[col + 1] += excess / 2.0;
cur_row[col] = 1.0;
}
last_row = row;
if (!found_excess) break;
}
return last_row == query_row
? cur_row[query_glass] : 0.0;
}
};