๋ฐฐ์ด numbers๊ฐ ์ฃผ์ด์ง๊ณ ๊ฐ ์ซ์ ์์ + ๋๋ -๋ฅผ ๋ถ์ฌ ๊ณ์ฐํ์ ๋ ๊ฒฐ๊ณผ๊ฐ target์ด ๋๋ ๊ฒฝ์ฐ์ ์๋ฅผ ๊ตฌํ๋ ๋ฌธ์ ์ด๋ค.
ํต์ฌ ํน์ง
๊ฐ ์ซ์๋ง๋ค ๋ ๊ฐ์ง ์ ํ ์กด์ฌ
+numbers[i]
-numbers[i]
์์
numbers = [1,1,1,1,1]
target = 3
์ฒ์์๋ ๊ฐ ์ซ์๋ง๋ค + ๋๋ -๋ฅผ ์ ํํ๋ ์์ ํ์ ๊ตฌ์กฐ๋ก ์ ๊ทผํ์๋ค.
ํต์ฌ ๊ตฌ์กฐ
ํ์ฌ ํฉ
โ +numbers[i]
โ -numbers[i]
DFS ์ฝ๋ ๊ตฌ์กฐ
void DFS(vector<int>& numbers, int target, int sum, int idx)
{
if(idx == numbers.size())
{
if(sum == target)
count++;
return;
}
DFS(numbers, target, sum + numbers[idx], idx + 1);
DFS(numbers, target, sum - numbers[idx], idx + 1);
}
์๊ฐ ๋ณต์ก๋
O(2^n)
๋ฌธ์ ๋ฅผ ๋ถ์ํ๋ฉด์ ์ด ๋ฌธ์ ๋ ๋จ์ํ DFS ๋ฌธ์ ๊ฐ ์๋๋ผ
๋ ๊ทธ๋ฃน์ผ๋ก ๋๋๋ ๋ฌธ์ ๋ก ํด์ํ ์ ์๋ค๋ ์ ์ ํ์ธํ์๋ค.
์ ์
P = +๋ก ์ ํํ ์ซ์๋ค์ ํฉ
N = -๋ก ์ ํํ ์ซ์๋ค์ ํฉ
๋ฌธ์ ์กฐ๊ฑด
P - N = target
๋ํ ๋ชจ๋ ์ซ์๋ ๋ฐ๋์ ์ฌ์ฉ๋๋ฏ๋ก
P + N = S
์ฌ๊ธฐ์ S๋ ๋ฐฐ์ด์ ์ ์ฒด ํฉ์ด๋ค.
๋ ์์ ๋ํ๋ฉด
2P = S + target
๋ฐ๋ผ์
P = (S + target) / 2
์ฆ ๋ฌธ์ ๋ ๋ค์๊ณผ ๊ฐ์ด ๋ณํ๋๋ค.
ํฉ์ด (S + target) / 2 ๊ฐ ๋๋ ๋ถ๋ถ์งํฉ์ ๊ฐ์ ๊ตฌํ๊ธฐ
Target Sum ๋ฌธ์ ๋ฅผ Subset Sum ๋ฌธ์ ๋ก ๋ณํ ๊ฐ๋ฅํ๋ค
๋ฌธ์ ๋ฅผ ๋ถ๋ถ์งํฉ ํฉ ๋ฌธ์ ๋ก ๋ณํํ๋ฉด DP๋ก ํด๊ฒฐ ๊ฐ๋ฅํ๋ค
DP ์ ์
dp[s] = ํฉ์ด s๊ฐ ๋๋ ๋ถ๋ถ์งํฉ์ ๊ฐ์
์ด๊ธฐ ์ํ
dp[0] = 1
์ด ์๋ฏธ๋
์๋ฌด๊ฒ๋ ์ ํํ์ง ์๋ ๊ฒฝ์ฐ
โ ํฉ 0์ ๋ง๋๋ ๊ฒฝ์ฐ 1๊ฐ
์ ์ด์
dp[s] += dp[s - num]
์๋ฏธ
ํฉ (s - num)์ ๋ง๋ค๋ ๋ชจ๋ ๊ฒฝ์ฐ์
num์ ์ถ๊ฐํ๋ฉด
ํฉ s๊ฐ ๋๋ ์๋ก์ด ๊ฒฝ์ฐ๊ฐ ์๊ธด๋ค
๊ตฌํ ์ฝ๋
int sum = accumulate(numbers.begin(), numbers.end(), 0);
int goal = (sum + target) / 2;
vector<int> dp(goal + 1, 0);
dp[0] = 1;
for (int num : numbers)
{
for (int s = goal; s >= num; s--)
{
dp[s] += dp[s - num];
}
}
์๊ฐ ๋ณต์ก๋
O(n * goal)
๋ฐฉ์ด ๊ธฐ๋ฅ์ ๋จ์ํ ๋ง๊ธฐ ๋์์ผ๋ก๋ง ์ฒ๋ฆฌํ๋ ๊ฒ์ด ์๋๋ผ, ์ค์ ํ๋ ์ด ํ๋ฆ์ ๋ง๊ฒ ๋ค์ ์์๋ฅผ ํจ๊ป ๋ถ์ฌ์ผ ํ๋ค.
์
๋ ฅ
โ
GA_Block ์คํ
โ
๋ฐฉ์ด ๋ฒํ ์ ์ฉ
์คํ๋ฏธ๋ ์๋ชจ ์์
์์ฐ ํ๋ณต ์ค์ง
โ
GameplayCue ์คํ
โ
์ค๋ VFX / ์กํฐ / ๋ฉ์ ํ์
๋ฐฉ์ด ํด์
โ
GA_Block ์ข
๋ฃ
โ
๋ฐฉ์ด ๋ฒํ ์ ๊ฑฐ
์คํ๋ฏธ๋ ์๋ชจ ์ข
๋ฃ
์คํ๋ฏธ๋ ์์ฐ ํ๋ณต ์์
โ
GameplayCue ์ ๊ฑฐ
โ
์ค๋ VFX / ์กํฐ / ๋ฉ์ ์ ๊ฑฐ
| ๊ตฌ์ฑ ์์ | ์ญํ |
|---|---|
GA_Block | ๋ฐฉ์ด ์์/์ ์ง/์ข ๋ฃ ์ ์ด |
DefenseBuffEffect | ๋ฐฉ์ด๋ ฅ ์ฆ๊ฐ ๋ฒํ |
StaminaDrainEffect | ๋ฐฉ์ด ์ค ์คํ๋ฏธ๋ ๊ฐ์ |
StaminaRegenEffect | ๋ฐฉ์ด ์ข ๋ฃ ํ ์์ฐ ํ๋ณต |
GameplayCue.State.BlockingShield | ๋ฐฉ์ด ์ค ์ค๋ ์ฐ์ถ ํ์ |
RemoveStaminaRegen();
ApplyStaminaDrain();
ApplyDefenseBuff();
| ์ฒ๋ฆฌ | ์๋ฏธ |
|---|---|
RemoveStaminaRegen() | ์์ฐ ํ๋ณต ์ค๋จ |
ApplyStaminaDrain() | ๋ฐฉ์ด ์ค ์คํ๋ฏธ๋ ๊ฐ์ ์์ |
ApplyDefenseBuff() | ๋ฐฉ์ด ๋ฒํ ์ ์ฉ |
RemoveDefenseBuff();
RemoveStaminaDrain();
ApplyStaminaRegen();
| ์ฒ๋ฆฌ | ์๋ฏธ |
|---|---|
RemoveDefenseBuff() | ๋ฐฉ์ด ๋ฒํ ์ ๊ฑฐ |
RemoveStaminaDrain() | ์คํ๋ฏธ๋ ์๋ชจ ์ค๋จ |
ApplyStaminaRegen() | ์์ฐ ํ๋ณต ์์ |
ํ์์
โ StaminaRegenEffect ์ ์ฉ ์ํ
โ ์คํ๋ฏธ๋ ์์ฐ ํ๋ณต
๋ฐฉ์ด ์์
โ ์์ฐ ํ๋ณต ์ ๊ฑฐ
โ ์คํ๋ฏธ๋ ์๋ชจ ์ ์ฉ
๋ฐฉ์ด ์ข
๋ฃ
โ ์คํ๋ฏธ๋ ์๋ชจ ์ ๊ฑฐ
โ ์์ฐ ํ๋ณต ๋ค์ ์ ์ฉ
DefenseBuffEffect
โ
GameplayCue.State.BlockingShield
โ
ํน์ VFX / ์กํฐ / SkeletalMesh ํ์
์ฆ Ability ๋ด๋ถ์์ ์ง์ ์ดํํธ๋ฅผ ์์ฑํ๋ ๋์ ,
๋ฒํ์ ์ฐ๊ฒฐ๋ GameplayCue๊ฐ ์ฐ์ถ์ ๋ด๋นํ๋๋ก ๋ถ๋ฆฌํ๋ค.
| ๋ฐฉ์ | ์์ |
|---|---|
| VFX ์ฌ์ | Niagara ์ค๋ ์ดํํธ |
| ์กํฐ Spawn | ๋ฐฉ์ด๋ง ์กํฐ ์์ฑ |
| ๋ฉ์ ํ์ | StaticMesh / SkeletalMesh ์ค๋ |
| ์ปดํฌ๋ํธ ํ ๊ธ | ๋ฏธ๋ฆฌ ๋ถ์ฌ๋ ์ค๋ ๋ฉ์ Show / Hide |
Block ์
๋ ฅ
โ
GA_Block
โโ DefenseBuffEffect ์ ์ฉ
โโ StaminaDrainEffect ์ ์ฉ
โโ StaminaRegenEffect ์ ๊ฑฐ
โ
GameplayCue.State.BlockingShield
โ
์ค๋ ์ฐ์ถ ํ์
Block ํด์
โ
EndAbility
โโ DefenseBuffEffect ์ ๊ฑฐ
โโ StaminaDrainEffect ์ ๊ฑฐ
โโ StaminaRegenEffect ์ ์ฉ
โ
GameplayCue ์ ๊ฑฐ
โ
์ค๋ ์ฐ์ถ ์ ๊ฑฐ
๋ฐฉ์ด๋ ํ ๋ฒ ์คํํ๊ณ ๋๋๋ ์คํฌ์ด ์๋๋ผ,
์
๋ ฅ ์ ์ง ๋์ ์ํ๋ฅผ ๊ณ์ ์ ์งํ๋ ๊ตฌ์กฐ๋ก ๋ณด๋ ๊ฒ์ด ๋ง์๋ค.
์ด๋ ๊ฒ ์ญํ ์ ๋๋ ์ผ ํ๋ ์ด ๊ฐ๊ฐ์ด ์์ฐ์ค๋ฝ๋ค.
Ability๋ ์ํ์ ๊ท์น์ ๋ด๋นํ๊ณ ,
์ค๋ ์ฐ์ถ์ GameplayCue๊ฐ ๋ด๋นํ๊ฒ ํ๋ฉด ๊ตฌ์กฐ๊ฐ ํจ์ฌ ์ ๋ฆฌ๋๋ค.

- ์๊ณ ๋ฆฌ์ฆ ๋ฌธ์ ์ ๊ทผ ๋ฐฉ์ ํ์ต
๋ถํธ ์ ํ ๋ฌธ์ ๋ฅผ ๋ ๊ทธ๋ฃน(P, N)์ผ๋ก ๋ถ๋ฆฌ โ ์์ ๋ณํ โ Subset Sum ๋ฌธ์ ๋ก ๋ณํ โ DP๋ก ํด๊ฒฐํ๋ ๋ฐฉ์์ผ๋ก ์ ๊ทผํ์๋ค.
GAS ๋ฐฉ์ด ์์คํ ๊ตฌํ- GA_Block์์ ๋ฐฉ์ด ์ํ์ ์คํ๋ฏธ๋ ์๋ชจ/์์ฐ ํ๋ณต์ ์ ์ดํ๊ณ , GameplayCue๋ฅผ ํตํด ๋ฐฉ์ด๋ง VFX๋ ์กํฐ ์ฐ์ถ์ ๋ถ๋ฆฌํ๋ ๊ตฌ์กฐ๋ก ์ค๊ณํ์๋ค. ์ด๋ฅผ ํตํด Ability๋ ์ํ์ ๋ฆฌ์์ค ๊ด๋ฆฌ, GameplayCue๋ ์๊ฐ ํจ๊ณผ ์ฒ๋ฆฌ๋ฅผ ๋ด๋นํ๋๋ก ์ญํ ์ ๋ถ๋ฆฌํ ์ ์์๋ค.