55. Unity 최종 프로젝트 1주차(3)

이규성·2024년 1월 12일
0

TIL

목록 보기
61/106

01/12

📌알고리즘 코드 카타 (Algorithm Code Kata)

최대공약수와 최소공배수

드디어 뿌셨다 !

public class Solution
{
    public long[] solution(int n, int m)
    {
        // 최대공약수 겹치는 약수 중 소수를 곱한 값
        // 12 = 1 2 3 4 6 12
        // 30 = 1 2 3 5 6 10 15 30
        // 12와 30의 최대 공약수는 2 * 3 = 6;

        Divisor(n); // 99 - 1, 3, 9, 11, 33, 99
        Divisor(m); // 90 - 1, 2, 3, 5, 6, 9, 10, 15, 18, 30, 45, 90
                    // 1, 3, 9가 공약수이니 추출하여서 제일 큰 9를 추출하자



        List<int> num = new List<int>();
        long GCDvisor = 0;

        for (int i = 0; i < Divisor(n).Count; i++)
        {
            for (int j = 0; j < Divisor(m).Count; j++)
            {
                if (Divisor(n)[i] == Divisor(m)[j])
                {
                    num.Add(Divisor(n)[i]); // 1, 3, 9 가 추출이 되네 뭐지;
                }
            }
        }

        GCDvisor += num.Max();

        // 최소공배수 둘의 배수 중 겹치는 값중 가장 작은 값
        // 12 = 24 36 48 60 || 2 * 2 * 3
        // 30 = 60          || 2 * 3 * 5
        // 12와 30의 최소공배수는 60;

        // Multiple(n); //  6 - 2 3 1
        // Multiple(m); //  4 - 2 2 1
                     // 2 2 3 1 을 추출해야 하는데... 

        // List<int> num2 = new List<int>();
        long LCMultiple;

        LCMultiple = (n * m) / GCDvisor;

        //if (Multiple(n).Count >= Multiple(m).Count)
        //{
        //    for (int i = 0; i < Multiple(n).Count; i++)
        //    {
        //        num2.Add(Multiple(n)[i]);
        //    }

        //    for (int i = 0; i < Multiple(m).Count; i++)
        //    {
        //        if (Multiple(n).Contains(Multiple(m)[i]) == false)
        //        {
        //            num2.Add(Multiple(m)[i]);
        //        }
        //    }
        //}
        //else
        //{
        //    for (int i = 0; i < Multiple(m).Count; i++)
        //    {
        //        num2.Add(Multiple(m)[i]);
        //    }

        //    for (int i = 0; i < Multiple(n).Count; i++)
        //    {
        //        if (Multiple(m).Contains(Multiple(n)[i]) == false)
        //        {
        //            num2.Add(Multiple(n)[i]);
        //        }
        //    }
        //}

        //for (int i = 0; i < num2.Count; i++)
        //{
        //    LCMultiple *= num2[i];
        //}



        long[] answer = new long[2] { GCDvisor, LCMultiple };
        Console.WriteLine(GCDvisor);
        Console.WriteLine(LCMultiple);

        return answer;
    }
    public List<int> Divisor(int num)
    {
        List<int> listnum = new List<int>();
        List<int> listDiv = new List<int>();
        for (int i = 1; i <= num; i++)
        {
            if (num % i == 0)
            {
                listnum.Add(i);
            }
        }

        //for (int k = 0; k < listnum.Count; k++)
        //{
        //    if (listnum[k] / 1 == 1)
        //    {
        //        listDiv.Add(listnum[k]);
        //    }
        //    else if (listnum[k] / 2 == 1)
        //    {
        //        listDiv.Add(listnum[k]);
        //    }
        //}

        return listnum;
        // return listDiv;
    }

    //public List<int> Multiple(int num)
    //{
    //    List<int> multiple = new List<int>();

    //    while (true)
    //    {
    //        if (num % 2 == 0)
    //        {
    //            num = num / 2;
    //            multiple.Add(2);
    //        }
    //        else if (num % 3 == 0)
    //        {
    //            num = num / 3;
    //            multiple.Add(3);
    //        }
    //        else
    //        {
    //            multiple.Add(num);
    //            break;
    //        }
    //    }
    //    return multiple;
    //}    
}

공약수와 공배수를 구하는 메서드를 이용하여 풀고 있었으나 계속 풀리지가 않아서 고민하던 차에 팀원분들께 물어보니 최소공배수를 구하는 공식을 알려 주셨다... 거의 3일을 머리를 싸매고 고민한 문제였는데 코드 한 줄로 풀리다니 얼탱~

 int gcd(int a, int b)
    {
        if (b == 0)
        {
            return a;
        }
        else 
        {
            return gcd(b, a % b); 
        }
    }

팀원분이 알려주신 유클리드 호제법. 이 코드 '딸깍'이면 약수가 구해진다고 한다. 얼탱 2트

📌기술 면접 준비

접근제한자란 무엇이며, 각각 어떤 차이가 있는지 비교해서 설명해주세요.

접근 제한자란 C#의 모든 형식에 존재하는 접근 수준을 의미합니다. 사용 중인 어셈블리나 다른 어셈블리에서 형식 또는 멤버를 사용할 수 있는지 여부를 제어합니다.
public: 형식을 참조하는 어셈블리에서 모두 접근할 수 있습니다.
private: 같은 class, struct에서만 접근할 수 있습니다.
protected: 같은 class, 파생된 class에서 접근할 수 있습니다.

참조: https://learn.microsoft.com/ko-kr/dotnet/csharp/programming-guide/classes-and-structs/access-modifiers

일단 계속 사용해오던 접근 제한자에 대해 작성할 수 있었다. 마이크로소프트에서 제공하는 C# 설명서를 보며 공부할 필요성이 있어 보인다.

📌팀 프로젝트 진행

Weapon 구현 설계

필요한 사항

공격 애니메이션

  1. 캐릭터의 손에 대검 위치 시킨다.
    대검의 위치를 수정하였다.
  2. 대검을 들었을 시 Idle 애니메이션 변경이 필요해 보인다.
    InventoryUI와 관련된 스크립트 리뷰 중.........
  3. 대검 공격 애니메이션의 콤보 어택이 통으로 되어 있던데 나눌 수 있는지 확인이 필요해 보인다.
    콤보가 나누어져 있는 것을 확인하였다. Player의 Animator에 추가하였다.

PlayerAttackState.cs, PlayerComboAttackState.cs

  1. 위의 사항을 점검하고 알맞게 두 스크립트의 수정이 필요해 보인다.

Weapon.cs, Health.cs

  1. FSM에 맞게 강의에 따라 우선 구현을 시도한다.
  2. 정상적으로 무기 공격이 동작한다면 상태이상 시스템을 적용해 본다.
    https://teamsparta.notion.site/231211-4c21f35ab2dc494eb063a324a94e54de

금일 구현 설계

양손 애니메이션을 추가하기 위한 설계 방향
ToolItemData에 두 손 무기 장착 bool 값을 추가하여 두 손 무기 Equip이 되면 그것에 맞는 AnimationState가 실행이 되는 방향으로 생각 중이다.
그럼 WeaponPrefab에 ItemSO를 추가하고 bool값을 받아오게 해볼까?
ToolSystem.Equip() 메서드 실행 시 bool == true; 실행이 될까...?
두 손 무기 AnimationState는 기존의 State에 추가를 할 것이냐 아니면 새로 만들 것이냐 고민이 된다.

금일 커밋한 사항

아직 작업 중...

0개의 댓글