❗c++ 의 unordered_map을 사용하는데 처음보는 오류가 발생하였다.

간접 참조가 잘못되었습니다 . 

 

✅ 해결방법

- 잘못된 코드

unordered_map<int, int> map;

map.insert(5, 1 );

 

- 올바른 코드

unordered_map<int, int> map;
   
map.insert( { 5, 1 } );	// { }로 감싸기!

: insert할 때 { key, value } 중괄호로 감싸줘야 한다. 

: map안에는 key와 value인 pair로 이루어져 있기때문에 pair로 초기화해야 한다.

 

map.insert(make_pair(5, 1 ));

: make_pair을 사용해도 된다.

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

 

프로그래머스

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

programmers.co.kr


❗풀이방법

1. unordered_map을 사용하여 key를 추가한다.

key가 중복되면 value값을 증가시킨다

#include <unordered_map>
unordered_map<int, int> map;
    
for (int i = 0; i < tangerine.size(); i++) 
{
    auto findIter = map.find(tangerine[i]);
    if (findIter == map.end())
    {
        map.insert({ tangerine[i], 1 });
    }
    else
        map[tangerine[i]]++;
}

 

2. value값으로 정렬하기 위해서 vector로 값을 복사한다.

	// unordered_map 안에 value값으로 정렬해야함 
	// 1. map의 원소를 vector로 복사
	// -> iterator가 가리키는 값을 복사해서 저장함 (pair가 포인터일 필요는 없음)
	vector<pair<int, int>> vec(map.begin(), map.end());

 

3. pair.second값을 기준으로 내림차순 정렬한다.

#include <algorithm>
bool compare(pair<int,int>& tu1, pair<int,int>& tu2)
{
	// 큰순으로 정렬
	return tu1.second > tu2.second;
}
sort(vec.begin() , vec.end() , compare );

 

4. pair.second 값 즉 갯수를 더하면서 총 갯수 (k)값이 넘는지 검사한다

	int sum = 0;
	for (int i = 0; i < vec.size(); i++) 
	{
		if (sum >= k) 
		{
			break;
		}
	
		sum += vec[i].second;
		answer++;
	}

 


❗전체코드

bool compare(pair<int,int> tu1, pair<int,int> tu2)
{
	// second가 큰순으로 정렬
	return tu1.second > tu2.second;
}

int solution(int k, vector<int> tangerine) {
    int answer = 0;
    
    unordered_map<int, int> map;
    
   	for (int i = 0; i < tangerine.size(); i++) 
	{
		auto findIter = map.find(tangerine[i]);
		if (findIter == map.end())
		{
			map.insert({ tangerine[i], 1 });
		}
		else
			map[tangerine[i]]++;
	}

	// unordered_map 안에 value값으로 정렬해야함 
	// 1. map의 원소를 vector로 복사
	// -> iterator가 가리키는 값을 복사해서 저장함 (pair가 포인터일 필요는 없음)
	vector<pair<int, int>> vec(map.begin(), map.end());

	sort(vec.begin() , vec.end() , compare );

	int sum = 0;
	for (int i = 0; i < vec.size(); i++) 
	{
		if (sum >= k) 
		{
			break;
		}
	
		sum += vec[i].second;
		answer++;
	}
	
    return answer;
}

 

로직 생각하는데는 얼마 안 걸렸는데 c++ 로 한다고 STL사용법이나 문법적으로 찾아본다고 시간이 많이 걸렸다....

 


https://github.com/kimYouChae

 

kimYouChae - Overview

클라이언트 개발자 지망생입니다! . kimYouChae has 6 repositories available. Follow their code on GitHub.

github.com

 

 

1. 스크립트 순서를 정하지 않고 실행했을 때

 

 

2. Edit -> Project Setting -> ScriptExcutionOrder에서 스크립트 순서를 지정했을 때

 

⬅️ 예상 Csv awake 와 Start출력 후 PlayerSelectUi의 Awake와 Start출력

 

⬅️ 출력 

지정한 순서대로 Awake 먼저 실행 후

순서대로 Start를 실행한다.

 

https://docs.unity3d.com/kr/2019.4/Manual/ExecutionOrder.html

 

이벤트 함수의 실행 순서 - Unity 매뉴얼

Unity 스크립트를 실행하면 사전에 지정한 순서대로 여러 개의 이벤트 함수가 실행됩니다. 이 페이지에서는 이러한 이벤트 함수를 소개하고 실행 시퀀스에 어떻게 포함되는지 설명합니다.

docs.unity3d.com

⬅️ 유니티의 라이프사이클을 알고있었는데도 왜 Awake 전에 Start가 실행된다고 생각했을까 ? ㅎㅅㅎ

생각해보면 당연한 실행순서인데.....

 

<코드>

- CsvParent.cs

public abstract class CsvParent : MonoBehaviour
{
    protected int _test;

    private void Awake()
    {
        Debug.Log("Csv Parent 스크립트의 Awake");
    }

    private void Start()
    {
        Debug.Log("Csv Parent 스크립트의 Start");

        F_setting();
    }

    public abstract void F_setting();
}

 

- AnimalCsv.cs

public class AnimalCsv : CsvParent
{
    public override void F_setting()
    {
        Debug.Log("이 디버깅은 animalCsv입니다 ");
    }
}

 

- PlayerSelectUi.cs

public class PlayerSelectUI : MonoBehaviour
{
    private void Awake()
    {
        Debug.Log("PlayerSelectUI 스크립트의 Awake");
    }

    private void Start()
    {
        Debug.Log("PlayerSelectUI 스크립트의 Start");
    }

}

 


3. MonoBehaviour를 상속받은 클래스를 상속받은 클래스의 이벤트 함수

: 위 스크립트에서 CsvParent는 MonoBehaviour를 상속받고있고, AnimalCsv는 CsvParent를 상속받고 있다.

여기서 AnimalCsv스크립트에 Awake()와 Start()를 추가하고 실행하게되면 ?

public class AnimalCsv : CsvParent
{
    private void Awake()
    {
        Debug.Log("AnimalCsv 스크립트의 Awake");
    }

    private void Start()
    {
        Debug.Log("AnimalCsv 스크립트의 Start");
    }

    public override void F_setting()
    {
        Debug.Log("이 디버깅은 animalCsv입니다 ");
    }
}

 

! 하위의 Awake()와 Start()만 실행된다! 

상위의 Awake()와 Start()는 실행되지 않는다. 

 MonoBehaviour를 상속받은 클래스를 상속받은 클래스의 이벤트 함수 를 사용할 때는 이러한 점에 주의해야한다. 

 


https://github.com/kimYouChae

 

kimYouChae - Overview

클라이언트 개발자 지망생입니다! . kimYouChae has 6 repositories available. Follow their code on GitHub.

github.com

 

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

 

프로그래머스

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

programmers.co.kr

 


❗풀이방법

1. 한 단어의 끝과 다음 단어의 처음이 같아야 한다.

// 첫번째 글자의 마지막 char
string endstring = words[0];
char endchar = endstring[endstring.size() - 1];

// 두번째 부터 검사 
for (int i = 1; i < words.size(); i++)
{
    // ..... 
        
    // endchar 초기화 해주기 
    endchar = words[i][words[i].size() - 1];
}

 

2. 중복되는 단어가 들어오면 안된다

  c++의 set 사용 

set<string> set;

auto temp = set.insert(words[i]);

: key값은 중복이 되지 않음

: set에 insert를 하게되면 pair<iterator , bool >형태로 return된다

: pair.first는 삽입한 원소(iteroator 타입), pair.second는 성공여부 

 

 


❗전체코드

#include <iostream>
#include <vector>
#include <set>
using namespace std;

int main()
{
	set<string> set;
	int turn = 1;	// 몇번째 턴이 돌았는지
	int personindex = 1;

	bool flag = false;	// 중복이 있었는지 

	// 첫번째 글자의 마지막 char
	string endstring = words[0];
	char endchar = endstring[endstring.size() - 1];

	set.insert(words[0]);

	// 두번째 부터 검사 
	for (int i = 1; i < words.size(); i++)
	{
		// 한바퀴 돌면
		if (i % n == 0)
			turn++;
		// 몇번째 사람인지
		if (personindex == n)
			personindex = 0;
		personindex++;

		auto temp = set.insert(words[i]);

		if (endchar != words[i][0] || temp.second == false)
		{
			flag = false;
			break;
		}

		endchar = words[i][words[i].size() - 1];
	
	}

	if (flag) 
	{
		answer.push_back(0);
		answer.push_back(0);
	}
	else 
	{
		answer.push_back(personindex);
		answer.push_back(turn);
	}
}

 


https://github.com/churush912837465

 

 

[ IPointer Interface ]

유니티에 내장되어있는 클릭,드래그,호버(마우스포인터 올릴때) 등의 이벤트를 처리해주는 아주 편리한 기능!  

 

  [IPointer Interface가 동작이 안돼요!]  

1. Scene에 EventSystem이 있어야함

2. Ui 오브젝트에 Raycast Target 을 체크 해야함

3. 게임오브젝트를 raycast한다면, Collider가 있어야함

4. 게임오브젝트를 raycast한다면, 카메라에 Physics Raycaster 가 있어야함

 

<참고링크> 

https://discussions.unity.com/t/implementing-ipointerclickhandler-interface-does-not-seem-to-work/150103/6

 

[사용방법]

< 지원되는 이벤트 >

https://docs.unity3d.com/kr/2022.1/Manual/SupportedEvents.html

 

지원되는 이벤트 - Unity 매뉴얼

이벤트 시스템은 다수의 이벤트를 지원하며 사용자가 작성한 입력 모듈을 통해 한층 더 효율적으로 커스터마이징할 수 있습니다.

docs.unity3d.com

 

using UnityEngine.EventSystems;

 

1. IPointerClickHandler - OnPointerClick() 

: 포인터를 누르고 뗄 때 호출됩니다.

public class EventSystemTest : MonoBehaviour , IPointerClickHandler 
{
    public void OnPointerClick(PointerEventData eventData)
    {
        Debug.Log("OnPointerClick");
    }
}

-> Ipointer Interface를 사용할 때에는 항상 그에 맞는 메서드를 오버라이딩 해야함! 

 

2. IPointerEnterHandler - OnPointerEnter() / IPointerExitHandler - OnPointerExit()

: 오브젝트에 포인터가 들어갈 때 / 나올 때 호출됩니다. 

 

3. IPointerDownHandler - OnPointerDown() / IPointerUpHandler - OnPointerUp()

: 포인터가 오브젝트 위에서 눌렸을 때 / 포인터를 뗄 때 호출됩니다.

 

 

4. IBeginDragHandler - OnBeginDrag()

/ IDragHandler - OnDrag()

/ IEndDragHandler - OnEndDrag()

: 드래그가 시작되는 시점에 / 드래그 하는 동안 / 드래그를 끝낸 시점에 대상오브젝트에서 호출됩니다.

 


https://github.com/kimYouChae

 

kimYouChae - Overview

클라이언트 개발자 지망생입니다! . kimYouChae has 6 repositories available. Follow their code on GitHub.

github.com

 

        static void Main(string[] args)
        {
            // 6. 배열에서 최대최소

            int[] array = new int[5];
            array[0] = 10;
            array[1] = 20;
            array[2] = 30;
            array[3] = 40;
            array[4] = 50;

            int min = 100;
            int max = 0;

            for (int i = 0; i < 5; i++) 
            {
                if (array[i] < min)
                    min = array[i];
                if (array[i] >= max)
                    max = array[i];
            }

            Console.WriteLine($"최소 : {min}");
            Console.WriteLine($"최대 : {max}");


            // 5. 이중반복문 구구단 출력
            
            Console.WriteLine("가로");
            for (int i = 2; i <= 9; i++)
            {
                for (int j = 1; j <= 9; j++)
                {
                    Console.Write($"{i} x {j} = {i * j}     ");
                }
                Console.WriteLine();
            }

            Console.WriteLine("가로");
            for (int i = 2; i <= 9; i++)
            {
                for (int j = 2; j <= 9; j++)
                {
                    Console.Write($"{j} x {i} = {i * j}     ");
                }
                Console.WriteLine();
            }
            

            // 4. 숫자 맞추기 게임
            
            Random random = new Random();
            int computer = random.Next(1, 101); // 1부터 100까지의 난수 생성
            int num;

            while (true)
            {
                Console.Write("Enter your guess(1-100): ");
                num = Convert.ToInt32(Console.ReadLine());

                if (num == computer)
                {
                    Console.WriteLine("Congratulations! You guessed the number.");
                    Console.WriteLine($"컴퓨터가 고른 숫자는 : {computer}");
                    break;
                }
                else if (num > computer)
                {
                    Console.WriteLine("Too high! Try again.");
                }
                else
                {
                    Console.WriteLine("Too low! Try again.");
                }
            }
            

            // 3. 펙토리얼 계산
            
            int num = 0;
            Console.Write($"숫자 {num}를 입력하세요: ");
            num = Convert.ToInt32(Console.ReadLine());

            int fact = 1;
            for (int i = 1; i < num; i++)
            {
                fact += fact * i;
            }

            Console.Write($"Factorial of {num} is {fact} ");
            

            // 2. 배열을 사용한 합계 및 평균
            
            List<int> numbers = new List<int>();
            int sum = 0;
            int average = 0;

            // 10개의 숫자 입력받기
            for (int i = 0; i < 3; i++)
            {
                Console.Write($"숫자 {i + 1}를 입력하세요: ");
                int number = Convert.ToInt32(Console.ReadLine());
                numbers.Add(number);
            }

            // 합계 계산
            for (int i = 0; i < numbers.Count; i++)
            {
                sum += numbers[i];
            }

            // 평균 계산
            average = sum / numbers.Count;

            // 결과 출력
            Console.WriteLine($"Sum: {sum}");
            Console.WriteLine($"Average: {average}");
            

            // 1. 홀수출력
            
            for (int i = 1; i < 100; i++) 
            {
                if (i % 2 == 0)
                    continue;

                Console.WriteLine(i);
            }
            

        }

1. 선택한 게임의 이름은 무엇인가요?

           -배틀그라운드

2.선택한 게임 장르는 무엇인가요?

          - FPS, 배틀로얄, 서바이벌

3. 선택한 게임의 어떤 시스템에 집중하셨나요 ?

         - 총기 등 아이템의 스폰 방식 

4. 해당 시스템이 동작하는 구조의 시작부터 과정을 자세하게 분석, 나열해봅시다.

- 아이템이 생성되는 포인트 존재

    - 랜드마크 등 우선순위가 높은곳부터 스폰됨

- 아이템의 종류에 따라 스폰 포인트가 다름

   - ex) 도로 주변에는 차 , 오토바이 등의 탑승류만 스폰됨

- 아이템이 중복으로 스폰되는것을 막음

   - 상대적으로 많이 스폰되는 권총, 탄창, 수류탄 등의 스폰율을 낮추고 총기류의 스폰율을 올림

 

5. 직접 분석해본 내용 중 가장 핵심이 되는 구성 요소는 무엇이라 생각하나요?

- 아이템이 생성되는 포인트와 생성되는 확율 , 그리고 맵 전체적으로 고르게 분포되게 생성되었는지가 중요함.

+ Recent posts