문제링크 : https://www.acmicpc.net/problem/12852 #include using namespace std;typedef long long ll;typedef pair pii;const int MAX = INT_MAX;int N;int dp[1000001];int main(){ ios_base::sync_with_stdio(0); cin.tie(0); cin >> N; for(int i=1; i 기본적인 초기화는 3번 조건에 해당하는 값으로 설정해준다.이에 따라 각 idx에 해당 하는 값은 idx-1의 횟수를 필요로 하므로 이에 맞게 초기화를 진행했다. 이후 1, 2번 조건에 대해 체크하며 더 작은 경우를 확인해준다.또 이어서 기존 3번 조건과 1, 2번 조건을..
문제 링크 : https://www.acmicpc.net/problem/2502 #include using namespace std;typedef long long ll;typedef pair pii;const int MAX = INT_MAX;int D, K;int A[31];int B[31];int main(){ ios_base::sync_with_stdio(0); cin.tie(0); cin >> D >> K; A[0] = 1; A[1] = 0; //A, B B[0] = 0; B[1] = 1; for(int i=2; i 먼저 간단하게 규칙을 찾아보면 다음과 같다.i = 0A (= A*1 + B*0)i = 1B (= B*0 + B*1)i = 2A + Bi = 3A + ..
문제 링크 : https://www.acmicpc.net/problem/1263 #include using namespace std;typedef long long ll;typedef pair pii;const int MAX = INT_MAX;int N, a, b;vectorv;int main(){ ios_base::sync_with_stdio(0); cin.tie(0); cin >> N; for(int i=0; i> a >> b; v.push_back({b, a}); } sort(v.begin(), v.end(), greater()); //일을 끝내야 하는 시간이 큰 값부터 정렬 int cur = v[0].first - v[0].second; //현..
문제링크 : https://www.acmicpc.net/problem/3151 #include using namespace std;typedef long long ll;typedef pair pii;const int MAX = INT_MAX;int N;int arr[10001];int main(){ ios_base::sync_with_stdio(0); cin.tie(0); cin >> N; for(int i=0; i> arr[i]; sort(arr, arr+N); ll result = 0; for(int i=0; i 3가지 합이 0이 되는 경우를 찾아야 한다.이를 위해 2가지 값을 고정 (2가지 값의 합) 시켜 놓고 나머지 1개의 값을 이분 탐색을 통해 찾아준다...
문제링크 : https://www.acmicpc.net/problem/2141#include using namespace std;typedef long long ll;typedef pair pii;const int MAX = INT_MAX;int N;ll sum = 0;vectorv;int main(){ ios_base::sync_with_stdio(0); cin.tie(0); cin >> N; for(int i=0; i> a >> b; v.push_back({a, b}); sum+=b; } sort(v.begin(), v.end()); ll tmp = 0; for(int i=0; i= (sum+1)/2) //정렬된 상태의 중앙값 출력 ..
문제링크 : https://www.acmicpc.net/problem/19598 #include using namespace std;typedef long long ll;typedef pair pii;const int MAX = INT_MAX;int N, B, C; //강의 갯수, 시작 시간, 종료 시간int cnt=1; //최소 강의실vectorv;priority_queue, greater> pq;int main(){ ios_base::sync_with_stdio(0); cin.tie(0); cin >> N; for(int i=0; i> B >> C; v.push_back({B, C}); } sort(v.begin(), v.end()); for(int i=..
문제링크 : https://www.acmicpc.net/problem/1374 #include using namespace std;typedef long long ll;typedef pair pii;const int MAX = INT_MAX;int N, A, B, C; //강의 갯수, 강의 번호, 시작 시간, 종료 시간int cnt=1; //최소 강의실vectorv;priority_queue, greater> pq;int main(){ ios_base::sync_with_stdio(0); cin.tie(0); cin >> N; for(int i=0; i> A >> B >> C; v.push_back({B, C}); } sort(v.begin(), v.end());..
문제링크 : https://www.acmicpc.net/problem/5545 #include using namespace std;typedef long long ll;typedef pair pii;const int MAX = INT_MAX;int N, A, B, C; //토핑 갯수, 도우 가격, 토핑 가격, 도우 열량int arr[10001];int main(){ ios_base::sync_with_stdio(0); cin.tie(0); cin >> N >> A >> B >> C; for(int i=0; i> arr[i]; } sort(arr, arr+N, greater()); //토핑 열량이 높은 순서대로 비교 int result = C/A; //1원당 열량 (최고)..
문제링크 : https://www.acmicpc.net/problem/20044 #include using namespace std;typedef long long ll;typedef pair pii;const int MAX = INT_MAX;int N;int arr[10001];int main(){ ios_base::sync_with_stdio(0); cin.tie(0); cin >> N; for(int i=0; i> arr[i]; } sort(arr, arr+2*N); //정렬 int score = MAX; for(int i=0; i 2*N 만큼 입력받고, 입력받은 값을 정렬시켜준다.이후 인덱스를 옮겨가며 배열의 양 끝값을 더해주고 이중 제일 작은..
문제링크 : https://www.acmicpc.net/problem/15970 #include using namespace std;typedef long long ll;typedef pair pii;const int MAX = INT_MAX;int x, y, N, dis;vectorv[5001];int arr[5001]; //색 갯수 저장int main(){ ios_base::sync_with_stdio(0); cin.tie(0); cin >> N; for(int i=0; i> x >> y; v[y].push_back(x); arr[y]++; //색 갯수 카운팅 } for(int i=1; i 브루트포스 방식의 정렬문제이다.점과 색깔을 입력할 때, 입..

C++로 블랙보드 키 설정하기이제 블랙보드에서 게임플레이의 상태를 설정해서 AI가 그에 따라 행동할 수 있게 설정하는 블랙보드 키를 C++을 통해 직접 설정해보자.우선 블랙보드 창을 보면 다음과 같이 기본 키를 볼 수 있다. 그리고 VScode에서 GetBlackboardComponent() 함수를 통해 블랙보드 키 값을 설정하는 것이 가능하다.해당 함수를 사용하기 위해서는 관련 헤더를 포함시켜주어야 한다.해당 함수를 통해 플레이어의 위치를 벡터값으로 받아와보자. 이제 설정한 키를 새롭게 할당해보자.상단 New Key를 눌러서 할당하며, VScode 상에서 할당한 이름과 타입을 정확히 일치시켜주어야 한다.이후 실행을 시켜보면 해당 키에 다음과 같이 플레이어 위치 좌표가 뜨는 것을 볼 수 있다. 제대로 ..
문제링크 : https://www.acmicpc.net/problem/14469 #include using namespace std;typedef long long ll;typedef pair pii;const int MAX = INT_MAX;int N, a, b;vectorv;int main(){ ios_base::sync_with_stdio(0); cin.tie(0); cin >> N; for(int i=0; i> a >> b; v.push_back({a, b}); } sort(v.begin(), v.end()); int time = v[0].first + v[0].second; for(int i=1; i 간단한 정렬문제이다.처음 도착시간을 기준으로..

행동 트리 및 블랙보드언리얼에서 정교한 AI 행동을 위해서는 보통 행동 트리를 생성한다.이에 행동 트리와 여러 가지 변수를 저장하고 AI의 메모리와 비슷한 기능을 하는 블랙 보드도 같이 생성해주자. 이제 행동 트리를 확인해보면 다음과 같다. 우측 디테일 패널에서 생성했던 블랙 보드를 확인할 수 있고, 우측 상단에서 해당 블랙 보드 모드로 전환도 가능하다. 이제 해당 행동 트리와 블랙 보드를 통해서 우리가 기존에 구현했던 AI 기능을 구현하도록 할 것이다.이를 위해 기존에 작성했던 VScode의 내용은 주석처리해놓고, 행동 트리를 위한 변수를 하나 선언해주자. 해당 행동 트리를 실행하는 함수는 RunBehaviorTree이다.실행하기에 앞서 해당 행동 트리가 유효한 지부터 체크를 해주자. 그리고 언리얼로 ..

AI 시선 확인하기전 강의에서 AI 시선 문제와, AI의 시야에서 벗어나게 되면 더 이상 AI가 쫓아오지 못하도록 해보자.AI의 시야를 체크하기 위해서는 LineOfSightTo 함수를 사용하게 된다.해당 함수를 통해 AI가 다른 액터(플레이어)를 볼 수 있는 지 없는 지에 대해 체크하고 이를 bool 타입으로 반환하게 된다. 만약 보이는 대상(플레이어)이 있다면 해당 대상에 포커스를하고 해당 대상을 향해 움직이게 되고,만약 보이는 대상(플레이어)이 없다면 포커스를 지우고 움직임 또한 멈추게 하자. 포커스를 지우는 방법은 ClearFocus() 함수를 통해 할 수 있다.여기에 매개변수로 포커스 우선순위에 대한 값이 들어간다.우리는 기존에 GamePlay를 기본 우선순위로 사용했기에 해당 값을 넣어주게 된..

내비메시를 이용해 AI 이동하기이제 AI가 플레이어를 향해 쫓아오게 만들어보자.AI가 장애물을 피해 플레이어에게 올 경로를 찾을 수 있어야 하는데, 이는 Nav Mesh통해 하게 된다. Nav Mesh는 레벨에서 걸어 다닐 수 있는 공간인 메시로 A* Pathfinding 알고리즘을 사용한다.해당 메시 구역 내 경로를 계획하면 AI가 그 경로를 따라 움직이게 된다.이를 위해 우선 Nav Mesh를 배치해주자. Nav Mesh를 보이도록 하기 위해서는 좌측 상단의 Show 항목에서 Navigation 항목을 활성화 해주어야 한다. 그리고 전에 생성했던 BP_ShooterAIController가 가진 컴포넌트 중에 다음과 같은 컴포넌트가 존재한다. 해당 컴포넌트는 FMesh를 찾아서 우리로 하여금 경로를 생..