알고리즘 문제, 언리얼 네트워크

김영웅·2025년 3월 12일

bitmasking을 이용한 문제

Q. 길이가 n(1 ≤ n ≤ 15)인 배열(또는 벡터)이 있는데 이 배열로부터 만들어질 수 있는 모든 부분집합의 합을 전부 구하여, 부분집합의 합 중에서 유일한 값들의 개수를 출력하는 프로그램을 짜보시오.

void solution()
{
	vector<int> nums = { 1, 2, 3  };
	set<int> sumSet;

	for (int i = 0; i < (1 << nums.size()); i++)
	{
		cout << "[ ";
		int sum = 0;
    
		for (int j = 0; j < nums.size(); j++)
		{
			if (i & (1 << j))
			{
				cout << nums[j] << " ";
				sum += nums[j];
			}
		}
    
		cout << "], 합 : " << sum << endl;
		sumSet.insert(sum);
	}

	cout << endl;
	cout << "중복을 제거한 총 합 개수 : " << sumSet.size() << endl;
}

비트 연산자를 이용한 방식이 잘 이해가 안됬는데, 이번에 어떻게 사용하는지 감을 좀 잡은 것 같다.


지갑크기 구하기
https://school.programmers.co.kr/learn/courses/30/lessons/86491

int solution(vector<pair<int, int>> businessCardVec)
{
	int xMax = 0, yMax = 0;

	for (auto& ele : businessCardVec)
	{
		int eleMax = max(ele.first, ele.second);
		int eleMin = min(ele.first, ele.second);
		int* purseMax = xMax > yMax ? &xMax : &yMax;
		int* purseMin = purseMax == &xMax ? &yMax : &xMax;

		if (*purseMax < eleMax)
			*purseMax = eleMax;

		if (*purseMin < eleMin)
			*purseMin = eleMin;
	}

	cout << "xMax : " << xMax << " yMax : " << yMax << endl;

	return xMax * yMax;
}

걍 조금 더 쉽게 회전 시켰으면 됬을거같다.


수포자 모의고사
https://school.programmers.co.kr/learn/courses/30/lessons/42840

vector<int> solution(vector<int> answers)
{
	//수포자 번호, 카운트
	map<int, int> answerMap;

	//수포자 패턴들
	vector<vector<int>> patterns =
	{
		{1, 2, 3, 4, 5},
		{2, 1, 2, 3, 2, 4, 2, 5},
		{3, 3, 1, 1, 2, 2, 4, 4, 5, 5 }
	};

	for (int i = 0; i < answers.size(); i++)
	{
		//수포자들의 패턴
		for (int j = 0; j < 3; j++)
			if (answers[i] == patterns[j][i % patterns[j].size()])
				answerMap[j]++;
	}

	int maxValue = 0;
	for (auto& ele : answerMap)
		maxValue = max(maxValue, ele.second);

	vector<int> result;
	for (auto& ele : answerMap)
		if (ele.second == maxValue)
			result.push_back(ele.first + 1);

	return result;
}

차피 숫자번 째 학생의 번호의 점수를 저자아는거라 map이 아니라 vector로 쓰는게 훨씬 나았을 것 같다.


언리얼 네트워크

RepNotify

  • 용도 : 값 변경 시 서버 → 클라이언트 로 이벤트 호출
  • 호출방법 : 자동
  • 실행 : 클라이언트
  • 네트워크가 연결되어 있으면 신뢰 가능
UPROPERTY(ReplicatedUsing=OnRep_HealthChanged)
int32 PlayerHealth = 100;

UFUNCTION()
void OnRep_HealthChanged();

ActorReplication

  • 용도 : 변수값의 동기화 및 오너쉽 관리로 서버 → 클라이언트로 실행
  • 호출방법 : 자동
  • 실행 : 서버에서 값 변경 후 클라이언트에 반영
  • 네트워크가 연결되어 있으면 신뢰 가능
UPROPERTY(Replicated)
int32 PlayerHealth = 100;

RPCs

  • 용도 : 서버와 클라이언트 간 양방향 함수 호출
  • 호출방법 : 수동
  • 실행 : 서버, 클라이언트 둘 다 가능
  • Reliable(TCP) / Unreliable(UDP) 선택 가능
  • 서버->단일 클라이언트 로 함수를 실행시키고 싶으면 Clinet를 UPROPERTY 안에 넣으면 된다.
  • 클라이언트->서버 로 함수를 실행시키고 싶으면 Server를 UPROPERTY 안에 넣으면 된다.
  • 서버->모든 클라이언트 로 함수를 실행시키고 싶으면 NetMulticast를 UPROPERTY 안에 넣으면 된다.
UFUNCTION(Server, Reliable)
void ServerFireWeapon();

UFUNCTION(NetMulticast, Unreliable)
void MulticastPlayExplosionEffect();

RPC는 기본적으로 비신뢰성 통신이다.
RPC 호출이 원격 머신에서 확실히 실행되도록 하기 위해서는 Reliable 키워드를 붙이면 된다.

요건 및 주의사항

RPC 의 정상 작동을 위해 충족시켜야 하는 요건이 몇 가지 있다.

  1. Actor 에서 호출되어야 한다.
  2. Actor 는 빈드시 replicated 여야 한다.
  3. 서버에서 호출되고 클라이언트에서 실행되는 RPC 의 경우, 해당 Actor를 실제 소유하고 있는 클라이언트에서만 함수가 실행된다.
  4. 클라이언트에서 호출되고 서버에서 실행되는 RPC 의 경우, 클라이언트는 RPC 가 호출되는 Actor를 소유해야 합니다.
  • Multicast RPC 는 예외다.
    • 서버에서 호출되는 경우, 서버에서는 로컬에서 실행될 뿐만 아니라 현재 연결된 모든 클라이언트에서도 실행된다.
    • 클라이언트에서 호출되는 경우, 로컬에서만 실행되며, 서버에서는 실행되지 않는다.
    • 현재 멀티캐스트 이벤트에 대해 단순한 throw틀 조절하는 메커니즘이 있다.
      멀티캐스트 함수는 주어진 액터의 네트워크 업데이트 기간동안 두 번 이상 리플리케이트되지 않는다.

출처

언리얼 RPC

profile
게임 프로그래머

0개의 댓글