- Array
arr
μ μλ μ«μλ₯Ό μ΄μ©ν΄μ λ§λ€ μ μλ νΈλ¦¬μ κ²½μ°μ μλ₯Ό ꡬνλ λ¬Έμ . - νΈλ¦¬μ non leaf node μ«μλ child node μ«μμ κ³±μΌλ‘ κ²°μ λμ΄μΌνλ κ·μΉμ΄ μμΌλ―λ‘ μ΄λ₯Ό λ°νμΌλ‘ κ²½μ°μ μλ₯Ό κ³μ°ν΄λ³΄λ©΄ λλ€.
- μ²μμλ λ μ«μμ μ‘°ν©μ λ°νμΌλ‘ μ«μμ κ³±μ΄ array
arr
μ μ‘΄μ¬νλμ§ μ²΄ν¬νκ³ μμΌλ©΄ μ΄λ₯Ό λ°νμΌλ‘ νΈλ¦¬λ₯Ό λ§λ€μ΄ root λΆν° νμνλ λ°©μμ μ·¨νλ€. - child node μ μ«μκ° λ€λ₯Έ κ²½μ°
- , λ κ°μ§ μμμ λν μ‘°ν©μ μ«μ + parent node νλλ§μΌλ‘ ꡬμ±λ νΈλ¦¬
- child nodeμ μ«μκ° κ°μ κ²½μ°
- , λ κ°μ§ μμμ λν μ‘°ν©μ μ«μ ( κ²½μ°μ μλ₯Ό μ μΈ) + parent node νλλ§μΌλ‘ ꡬμ±λ νΈλ¦¬
- μ΄λ° λ°©μμΌλ‘ μ κ·ΌνμΌλ μΌλΆ ν
μ€νΈ μΌμ΄μ€μμ μ€ν¨νμΌλ©° μμΈμ μ°Ύμ§ λͺ»ν΄μ ν΄λ΅μ μ°Έμ‘°νλ€.
- child node μ«μ μ‘°ν©μμ parent node μ«μλ₯Ό λ§λ€μ΄λ΄λ λ°©μ보λ€λ λ°λλ‘ μ κ·Όνλ λ°©μμ΄ λ ν¨μ¨μ μ΄κ³ μ½κ² ν μ μλ κ²μΌλ‘ μκ°λλ€.
- νμ΄ λ°©μμ λ€μκ³Ό κ°λ€.
- λ¨Όμ array
arr
λ₯Ό μμ μ«μκ° μμΌλ‘ μ€λλ‘ μ€λ¦μ°¨μμΌλ‘ μ λ ¬νλ€. - κ° node λ³ κ²°κ³Όλ₯Ό κ³μ°νμ¬ μ μ₯νλ€.
- root nodeμ factor node (child node) μ‘°ν©μ κΈ°μ€μΌλ‘ λλ¨Έμ§ child nodeλ₯Ό κ³μ°νλ€.
- root μ«μκ° factorλ‘ λλμ§ μλλ€λ©΄ ν΄λΉλλ child node μ‘°ν©μ΄ μ‘΄μ¬νμ§ μλ κ²μ΄λ―λ‘ skip νλ€.
- λΉμ°νμ§λ§ factorκ° rootλ κ°κ±°λ ν¬λ©΄ child node μ‘°ν©μ΄ μ‘΄μ¬νμ§ μμΌλ―λ‘ (μ«μλ 1λ³΄λ€ ν° κ°μ΄μ΄μΌ νλκΉ) skip νλ€.
- λλ¨Έμ§ λ
Έλ
quotient
λ root / factor
λ‘ κ²°μ λλ€.
- νμ¬ λ
Έλ
root
μ κ²½μ°μ μλ factor
, quotient
node κ°κ°μ κ²½μ°μ μμ κ³±μ ν©μ΄λ€. - μ΄λ κ² κ³μ°λ κ° λ
Έλ λ³ κ²½μ°μ μ
subResult
λ₯Ό λͺ¨λ λνλ©΄ μ 체 κ²½μ°μ μκ° λλ€. μ¬κΈ°μ λͺ¨λλ¬ μ°μ°μ νλ©΄ λλ€.
class Solution {
public:
static constexpr int MOD = 1e9 + 7;
int numFactoredBinaryTrees(vector<int>& arr) {
sort(arr.begin(), arr.end());
long long result = 0;
unordered_map<int, long> subResult;
for (auto root : arr) {
subResult[root] = 1;
for (auto factor : arr) {
if (factor >= root) break;
if (root % factor != 0) continue;
int quotient = root / factor;
if (subResult.find(quotient) != subResult.end()) {
subResult[root] += subResult[factor] * subResult[quotient];
}
}
}
for (auto& entry : subResult) {
result += entry.second;
}
return result % MOD;
}
};