TIL

20240123 TIL

[폴른] 2024. 1. 23. 20:50

Today I Learned :

1. 알고리즘 (프로그래머스)를 풀다가 타임아웃 이슈가 발생

기본 풀이는 O(n^3) 인데 이걸 낮추기 위해 Array.Sort()를 사용(최고 O(2n^2)로 판단)하였는데

일부 예시에서 타임아웃이 발생. Sort 부분으로 추측.

삼중 for문은 정상적으로 작동함.

 

문제에서 테스트케이스가 어떻게 들어오는건지 궁금하다.

 

// O(n^3)
public class Solution {
    public int solution(int[] number) {
        int answer = 0;
        int n = number.Length;
        for (int i = 0; i < n - 2; i++)
        {
            for (int j = i + 1; j < n - 1; j++)
            {
                for (int k = j + 1; k < n; k++)
                {
                    if (number[i] + number[j] + number[k] == 0)
                    {
                        answer++;
                    }
                }
            }
        }
        return answer;
    }
}

// O(n^2)
public class Solution {
    public int solution(int[] numbers) {
    {
        Array.Sort(numbers); // 배열을 정렬

        int count = 0;
        int length = numbers.Length;

        for (int i = 0; i < length - 2; i++)
        {
            int left = i + 1;
            int right = length - 1;

            while (left < right)
            {
                int sum = numbers[i] + numbers[left] + numbers[right];

                if (sum == 0)
                {
                    count++;

                    left++;
                    right--;

                    // 중복된 값의 개수만큼 추가
                    while (left < right && numbers[left] == numbers[left - 1])
                        count++;

                    while (left < right && numbers[right] == numbers[right + 1])
                        count++;
                }
                else if (sum < 0)
                {
                    left++;
                }
                else
                {
                    right--;
                }
            }
        }

        return count;
    }
}

 

2. Input System 문서 업데이트

https://cgtg.tistory.com/428

3. 상호작용 기능 개발

상호작용 대상에게 Collider 2D 를 붙이고 IsTrigger 체크.

나와 충돌하여 트리거가 발생하면 하고자하는 이벤트를 처리한다.

 

아래 코드는 Enter 하는 경우 충돌중인 상태충돌한 대상을 저장해놓고 유저의 Input 이벤트를 기다린다.

Exit 하면 위 상황을 해제한다.

 

Input 이벤트가 들어오는 경우 저장해놓은 데이터를 통해서 다음 이벤트를 발생시켰다.

private void OnTriggerEnter2D(Collider2D collision)
{
    if (_levelCollisionLayer.value == (_levelCollisionLayer.value | (1 << collision.gameObject.layer)))
    {
        //Debug.Log("충돌 중");
        IsNearby = true;
        _interactInfo.SetActive(true);

        NPCStats npcStats = collision.GetComponent<NPCStats>();
        type = npcStats.type;
    }
}

private void OnTriggerExit2D(Collider2D collision)
{
    IsNearby = false;
    _interactInfo.SetActive(false);
    _dialog.SetActive(false);
}

 

 

4. 싱글톤 컨트롤

C# Generic으로 만들어서 사용하고 싶은데 컨트롤이 아직 어렵다.

씬이 넘어가는 경우 새로운 싱글톤을 발생시키는데 이 경우 컨트롤을 별도로 하여 Destroy 해줘야 한다.

그런데 여러군데에서 참고하여 만들어진 추상화 싱글톤을 쓰고있는데 뭔가 깔끔하게 작동하지 않는다.

그리고 싱글톤에 부모가 있는 경우 파괴되지 않고 부모부터 새로 생성된다.(DontDestroyOnLoad가 여러개 생성됨)

개발을 좀 더 진행하면서 테스트해봐야 할듯하다