한국중학교에 다니는 학생들은 각자 정수 번호를 갖고 있습니다. 이 학교 학생 3명의 정수 번호를 더했을 때 0이 되면 3명의 학생은 삼총사라고 합니다. 예를 들어, 5명의 학생이 있고, 각각의 정수 번호가 순서대로 -2, 3, 0, 2, -5일 때, 첫 번째, 세 번째, 네 번째 학생의 정수 번호를 더하면 0이므로 세 학생은 삼총사입니다. 또한, 두 번째, 네 번째, 다섯 번째 학생의 정수 번호를 더해도 0이므로 세 학생도 삼총사입니다. 따라서 이 경우 한국중학교에서는 두 가지 방법으로 삼총사를 만들 수 있습니다.
한국중학교 학생들의 번호를 나타내는 정수 배열 number가 매개변수로 주어질 때, 학생들 중 삼총사를 만들 수 있는 방법의 수를 return 하도록 solution 함수를 완성하세요.
number | result |
---|---|
[-2, 3, 0, 2, -5] | 2 |
[-3, -2, -1, 0, 1, 2, 3] | 5 |
[-1, 1, -1, 1] | 0 |
using System;
public class Solution
{
public int solution(int[] number)
{
int answer = 0;
int n;
int m = number.Length - 1;
for (int i = 0; i < number.Length - 1; i++)
{
for (int j = i + 1; j < m; j++)
{
n = number[i] + number[j];
for (int k = j + 1; k < number.Length; k++)
{
if (n + number[k] == 0)
{
answer++;
}
}
}
}
return answer;
}
}
반복문을 세 번이나 중첩시켜버렸다. 계산 속도에서 이슈가 있을까 걱정이 되었지만 워낙 입력 데이터와 계산 과정의 크기가 작다보니 별 문제 없이 성공하였다.
반복문과 조건문의 사용이 익숙해 지는 것은 좋은 것 같지만... 뭔가 이러한 연산을 할 때 사용하는 알고리즘이 있을 것 같다. 추후에 추가 예정.
필요한 사항
1. 위의 사항을 점검하고 알맞게 두 스크립트의 수정이 필요해 보인다.
Weapon과 monster 사이의 상호작용을 구현하자. collider등 . . .
Weapon의 damage를 어떻게 player에게 전달할지 결정하자. ItemSO -> Player . . .
TwinDagger가 오른손에 쥐어졌을 때 이슈를 해결하자.
Weapon.cs에 상태이상 등의 효과 추가를 트라이해보자.
skleton의 inspactor 창의 HP 항목을 보면 10 -> 8로 줄어든 것을 확인할 수 있다.
Weapon.cs
public class Weapon : MonoBehaviour, IAttack
{
// lgs 24.01.19
private int damage; // SO의 데미지를 받아오자
private void Awake()
{
gameObject.GetComponentInChildren<BoxCollider>().enabled = false;
Managers.Game.Player.ToolSystem.OnEquip += DamageOfTheEquippedWeapon;
// ToolSystem의 이벤트에 무기 데미지를 참조해오는 메서드를 구독하여 구현
}
private void OnTriggerEnter(Collider other)
{
Attack(other.GetComponent<IHit>());
}
public void Attack(IHit target)
{
if (target == null) // target이 null인 상황을 배제한다.
{
return;
}
target.Hit(this, damage);
}
public void DamageOfTheEquippedWeapon(QuickSlot quickSlot)
{
// WeaponDataSO의 damage 값을 참조해오는 메서드
ItemData weapon = quickSlot.itemSlot.itemData;
ToolItemData toolItemDate = (ToolItemData)weapon;
damage += toolItemDate.damage;
}
}
여태까진 자기 자신의 collider를 판별하여 배제하는 방식으로 구현했었는데, 이슈 공유 후 Layer에서 충돌 범위를 제한하는 것이 어떻냐는 조언을 들었고 더 직관적이라고 생각이 되어서 그대로 구현하였다.
PlayerComboAttackState.cs
public override void Enter()
{
base.Enter();
StartAnimation(_stateMachine.Player.AnimationData.ComboAttackParameterHash);
_weapon = Managers.Game.Player.GetComponentInChildren<Weapon>(); // lgs 24.01.19
_weapon.gameObject.GetComponentInChildren<BoxCollider>().enabled = true;
_alreadyAppliedForce = false;
_alreadyApplyCombo = false;
int comboIndex = _stateMachine.ComboIndex;
_attackInfoData = _stateMachine.Player.Data.AttackData.GetAttackInfo(comboIndex);
_stateMachine.Player.Animator.SetInteger("Combo", comboIndex);
}
public override void Exit()
{
base.Exit();
StopAnimation(_stateMachine.Player.AnimationData.ComboAttackParameterHash);
_weapon.gameObject.GetComponentInChildren<BoxCollider>().enabled = false; // lgs 24.01.19
if (!_alreadyApplyCombo)
_stateMachine.ComboIndex = 0;
}
FSM 패턴으로 구동 중이니 공격하는 State에서 플레이어가 현재 들고 있는 무기의 BoxCollider를 켜고 끄는 방식으로 해결하였다. 추후에 수정될 가능성 농후 . . .
Weapon.cs를 추가하였습니다.
Monster와 Weapon 간의 damage를 구현하였습니다.
Player, Weapon, Monster에 각각 이름과 같은 Layer를 추가하였습니다.
한 손 검 이슈를 수정하였습니다.
테스트를 위해 타인의 스크립트를 건드렸다면 꼭 다시 돌려놓자...! 간 떨려라