카테고리 없음

내일배움캠프 28일차 TIL 유니티 3D - 1

joseph2518 2024. 10. 23. 21:31

20241023 / Unity_6차  7주차 수요일

 

 

 

유니티 3D 주차가 되었다.

 

3D는 매우 막막할 줄 알았으나 에셋만 준비되어 있다면 아직까지는 할만한 것 같다.

 

캐릭터에 카메라가 달린 모습

 

 

 

그보다 오는 토요일 코딩테스트가 예정되어있어 알고리즘을 보는데 진짜들의 Linq 사용법을 보고 정신이 멍해졌다.

 

https://school.programmers.co.kr/learn/courses/30/lessons/92334

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

 

대략 리스트에 대한 처리 알고리즘을 중점적으로 다루는 문제인데,

내가 짠 코드는 다음과 같다.

public int[] solution(string[] id_list, string[] report, int k)
{
    int userNum = id_list.Length;
    int[] answer = new int[userNum];

    // 유저네임을 int값으로 변환
    Dictionary<string, int> userIDHash = new Dictionary<string, int>();
    for (int i = 0; i < userNum; i++)
    {
        userIDHash.Add(id_list[i], i);
    }

    // 신고당한 유저에 대한 신고자들의 리스트
    List<List<int>> reportedID_Reporters = new List<List<int>>();
    reportedID_Reporters.Capacity = userNum;
    for (int i = 0; i < userNum; i++)
    {
        reportedID_Reporters.Add(new List<int>());
    }
    int[] reportCount = new int[userNum];

    for (int i = 0; i < report.Length; i++)
    {
        string[] reportMsg = report[i].Split(' ');
        string reporter = reportMsg[0];
        string reported = reportMsg[1];
        int reporterN = userIDHash[reporter];
        int reportedN = userIDHash[reported];

        if (reportedID_Reporters[reportedN].Contains(reporterN) == false)
        {
            reportedID_Reporters[reportedN].Add(reporterN);
        }
    }

    // 신고당한 유저가 이용정지 기준을 충족했을 때 그 신고자들의 값 +1
    for (int i = 0; i < userNum; i++)
    {
        if (reportedID_Reporters[i].Count >= k)
        {
            for (int j = 0; j < reportedID_Reporters[i].Count; j++)
            {
                answer[reportedID_Reporters[i][j]]++;
            }
        }
    }

    return answer;
}

 

답은 맞았지만 속도에 대한 건 잘 모르겠다.

 

근데 다른 사람의 풀이가...

public int[] solution1(string[] id_list, string[] report, int k)
{
    var tReport = report.Distinct().
        Select(s => s.Split(' ')).
        GroupBy(g => g[1]).
        Where(w => w.Count() >= k).
        SelectMany(sm => sm.Select(s => s[0])).
        ToList();

    return id_list.Select(x => tReport.Count(c => x == c)).ToArray();
}

 

????

 

이게 이런 단 몇줄로 끝난다고?

 

근데 어떻게 이게 되는건지 이해할 수가 없었다.

 

검색을 통해 각각의 함수가 어떤 기능을 하는지는 알아냈는데 그래도 저게 어떻게 되는지는 모르겠다.

 

이것은 쓸데없는 기교인가 아니면 숙련자들은 한눈에 보이는 완벽한 코드인가...

 

열심히 짠 코드가 너무 억울해서 실행 시간을 비교해 봤다.

오른쪽이 아래의 코드를 실행한 결과다

 

그럼 그렇지!  난 틀리지 않았어!!

 

대부분의 케이스에서 실행 속도가 어마무시하게 느려졌다.

 

정확히는 모르겠지만 아마 var tReport에 결과값이 바로 들어오는 게 아니고

Select, GroupBy 등의 함수를 하나씩 실행할 때마다 IEnumerable(열거자)를 새로 생성하느라 느려지는 것같다.

 

 

 

 

아무튼 취직하자고 하는 거니까 당분간은 강의보다 알고리즘 연습을 중점적으로 해야겠다.