π λ¬Έμ λ§ν¬
μμ λ²μ£
μ½λ©ν
μ€νΈ μ°μ΅ - μμ λ²μ£ λ¬Έμ μ
λλ€.
π‘ λ¬Έμ νμ
- Aμ B λ λͺ
μ΄
info.lengthκ°μ 물건μ νλμ©, μμλλ‘ λ μ€ ν λͺ μ΄ νμΉλ€. (물건λ§λ€ νμΉλ μ¬λμ μ ν΄μΌ ν¨) info[i] = [a, b]λiλ²μ§Έ 물건μ Aκ° νμΉλ©΄ Aμ νμ μ΄aλ§νΌ, Bκ° νμΉλ©΄ Bμ νμ μ΄bλ§νΌ λμ΄λλ€λ λ»μ΄λ€.- Aμ νμ μ
nλ―Έλ§, Bμ νμ μmλ―Έλ§μΌλ‘ μ μ§ν΄μΌ μ‘νμ§ μλλ€. - λͺ¨λ 물건μ νμΉλ©΄μ λ λ€ μ‘νμ§ μμ μ μλ κ²½μ° μ€, Aμ μ΅μ’
νμ μ΄ μ΅μκ° λλ κ°μ ꡬνλ€. κ·Έλ° λΆλ°°κ° λΆκ°λ₯νλ©΄
-1μ λ°ννλ€.
ποΈ μ κ·Ό λ°©λ²
iλ²μ§Έ 물건κΉμ§ μ²λ¦¬νμ λ "Aμ νμ μ΄ μ ννa, Bμ νμ μ΄ μ ννbκ° λλ λΆλ°°κ° κ°λ₯νκ°?"λ₯Ό μνλ‘ κ°λdp[len + 1][n][m]λΆλ¦¬μΈ λ°°μ΄μ μ¬μ©νλ€.dp[0][0][0] = trueμμ μμν΄μ, 물건μ νλμ© μ²λ¦¬ν λλ§λ€ λ κ°μ§ μ νμ λͺ¨λ μ μ΄μν¨λ€.- Aκ° νμΉλ κ²½μ°:
traceA + a < nμ΄λ©΄dp[i + 1][traceA + a][traceB] = true - Bκ° νμΉλ κ²½μ°:
traceB + b < mμ΄λ©΄dp[i + 1][traceA][traceB + b] = true - νμ μ΄ μκ³κ°(
n,m) μ΄μμ΄ λλ μ μ΄λ μ‘νλ κ²½μ°μ΄λ―λ‘ μμ λ§λ€μ§ μλλ€.
- Aκ° νμΉλ κ²½μ°:
- λͺ¨λ 물건(
len)μ μ²λ¦¬ν λ€,dp[len][traceA][traceB]κ°trueμΈ μνλ€ μ€traceAκ° κ°μ₯ μμ κ°μ μ°Ύλλ€.traceAλ₯Ό0λΆν° μμλλ‘ νμνλ―λ‘, μ²μμΌλ‘trueλ₯Ό λ§λλ κ°μ΄ κ³§ μ΅μκ°μ΄ λμ΄ λ°λ‘ λ°νν μ μλ€.
- λκΉμ§
trueμΈ μνκ° νλλ μλ€λ©΄ λ λ€ μ μ‘νκ² λͺ¨λ 물건μ λΆλ°°ν λ°©λ²μ΄ μλ€λ λ»μ΄λ―λ‘-1μ λ°ννλ€.
// Aκ° νμΉ¨
if (traceA + a < n) {
dp[i + 1][traceA + a][traceB] = true;
}
// Bκ° νμΉ¨
if (traceB + b < m) {
dp[i + 1][traceA][traceB + b] = true;
}
π§© μ½λ ꡬν
class Solution {
public int solution(int[][] info, int n, int m) {
int len = info.length;
// iκ°μ 물건μ μ²λ¦¬νμ λ, Aμ νμ μ΄ a, Bμ νμ μ΄ bκ° λλ κ²½μ°κ° μ‘΄μ¬ν¨?
boolean[][][] dp = new boolean[len + 1][n][m]; // i, a, b
dp[0][0][0] = true;
for (int i = 0; i < len; i++) {
int a = info[i][0];
int b = info[i][1];
for (int traceA = 0; traceA < n; ++traceA) {
for (int traceB = 0; traceB < m; ++traceB) {
if (!dp[i][traceA][traceB]) continue;
// Aκ° νμΉ¨
if (traceA + a < n) {
dp[i + 1][traceA + a][traceB] = true;
}
// Bκ° νμΉ¨
if (traceB + b < m) {
dp[i + 1][traceA][traceB + b] = true;
}
}
}
}
for (int traceA = 0; traceA < n; ++traceA) {
for (int traceB = 0; traceB < m; ++traceB) {
if (dp[len][traceA][traceB]) {
return traceA;
}
}
}
return -1;
}
}