분류 전체보기

    [Unreal] 캐릭터 이동 관련 컴포넌트 (UCharacter / UPawn MovementComponent*)

    캐릭터의 이동 관한 행동을 담당하며 대표적인 기능들은 아래와 같다. 캐릭터 최대치 변경 수영 속도 하중 힘 걸음 속도 숙인 채 걷는 속도 캐릭터가 특정 행동 진행 중일 시 숙이는 중 낙하하는 중 날아다니는 중 지상에 다니는 중 (걷기, 운전 등) 수영 하는 중 걸을 수 있는 상태 또는 걷는 중 캐릭터가 숙이는 함수와 숙인 상태에서 일어서는 함수 플레이어가 수영하는 함수 플레이어가 점프하는 함수 플레이어가 엎드리는 함수는 따로 구현할 필요가 있다. 관련 도튜먼트 : https://docs.unrealengine.com/5.0/enUS/API/Runtime/Engine/GameFramework/UCharacterMovementComponent/

    [Unreal] C++ 인터페이스 (UInterface)

    생성 방법은 우클릭 후 > New C++ Class > Unreal Interface 언리얼에선 모든 오브젝트들은 인스턴스화가 되어야 되기 때문에 인터페이스가 단순한 가상함수 (순수 가상 함수 X)이다. 원형은 아래와 같다. UWeaponInterface는 그대로 놔둔다, 리플렉션 전용이기에 절대로 지워서는 안된다. 아래에 있는 I로 시작되는 IWeaponInterface에 구현부를 넣는다. 헤더파일 #pragma once #include "CoreMinimal.h" #include "UObject/Interface.h" #include "WeaponInterface.generated.h" // This class does not need to be modified. UINTERFACE(MinimalAP..

    분리 집합 (Disjoint Set) / Union-Find

    다음과 같은 메신저 프로그램이 있다. "A와 B가 친구 관계이고, 내가 A와 친구 관계이면 자동으로 나와 B는 친구 관계가 된다." 이 메신저 프로그램을 통해 내가 A라는 사람과 친구 관계를 맺었다. 다음과 같은 관계도에서, 내가 주황색으로 표시된 사람과 친구 관계가 될 수 있을지는 어떻게 알 수 있을까? 위처럼 친구 관계를 그래프로 나타낸 후 나를 시작으로 그래프 탐색(DFS, BFS)을 통해 목표 정점까지 도달할 수 있는지 확인하면 간단할 것이다. 하지만 새로운 친구 관계는 언제나 생겨날 수 있다. 만약 주황색으로 표시된 친구 관계가 새로 생겼다고 할 때, 우리는 주황색 사람과 친구 관계가 될 수 있는지 알기 위해서다시 그래프 탐색을 진행해야 한다. 하지만 이 메신저 프로그램을 사용하는 사용자의 수가..

    최소 스패닝 트리 (MST) / 크루스칼 알고리즘 (Kruskal Algorithm)

    최소 스패닝 트리 (MST, Minimum Spanning Tree) 그래프의 스패닝 트리(신장 트리, Spanning Tree)란, 그래프의 모든 정점을 잇지만 사이클이 없는 부분 그래프를 의미한다. 위와 같은 그래프에서, 양쪽의 붉은 간선으로 이어진 부분 그래프들은 모두 스패닝 트리에 해당한다. 즉, 형태와 관계없이 모든 정점을 사이클 없이 이을수만 있다면, 그것이 곧 스패닝 트리이다. 스패닝 트리는 이름처럼 트리의 일종이므로, V개의 모든 정점을 연결하는 간선의 수는 V - 1개이다. 최소 스패닝 트리(MST)는 이러한 스패닝 트리 중, 간선의 가중치 합이 최소가 되는 스패닝 트리를 말한다. 이러한 최소 스패닝 트리를 구하는 알고리즘은 대표적으로 Kruskal, Prim 알고리즘이 존재한다. 크루스..

    가중치 그래프와 임계 경로(Critical Path)

    가중치 그래프 Weighted Graph 숫자로 된 가중치를 각 간선에 부여하여 가중치 그래프(weighted graph)로 확장할 수 있다. 이는 비가중치 그래프를 일반화한 것인데, 비가중치 그래프는 모든 간선의 가중치가 동일해서 생략한 가중치 그래프이고 더 많은 정보를 표현할 수 있어서 유용하다. 그래프가 도로망을 나타낸다면 가중치는 거리 또는 두 지점 사이를 여행하는데 걸리는 시간일 수 있다. 가중치 그래프는 비가중치 그래프와 유사하게 표현할 수 있다. 인접 행렬로 나타낸다면, 가중치 그래프의 인접 행렬은 엔트리로 간선들의 가중치를 갖거나 연결되지 않은 엔트리들에 대해서는 특수한 값을 갖는다. 아래는 위 그래프를 인접행렬로 표현한 것이다. 이 인접행렬에서는 연결된 간선이 없을 때는 특수 값으로 \i..

    [Unity] / [SerializeField] [HideInInspector] [Serializable] 어트리뷰트 인스펙터 공개/비공개

    public 사용시 인스펙터에 오픈시켜 값을 수정 할 수 있으며 타 클래스에서도 접근이 가능하다. 유니티는 public만 직렬화 해주는데 private 또는 protected 필드를 명시적으로 직렬화 해줌으로서 인스펙터에 오픈 시켜준다. 단, 유니티의 공식 가이드에서는 이것을 "특별한 경우가 아니면 사용하지 않는다."라며, "public"을 추천하고 있다. 반대로, 변수의 접근 제한자가 "public"으로 지정되어 있지만, 유니티 에디터의 Inspector에서 노출되는 것을 막기 위해서는 "[HideInInspector]" 키워드를 사용한다. (참고로, HideInInspector 키워드는 키워드 아래에 있는 모든 변수를 노출하지 않지만, SerializeField 키워드는 키워드 바로 다음에 있는 변수..

    문자열 (소문자 대문자 변환) transform 함수

    algorithm 헤더파일 내에 있다 toupper (대문자), tolower(소문자) 그리고 :: 익명 네임스페이스 무조건 붙여야한다. #include #include #include using namespace std; int main() { string str1, str2; cin >> str1 >> str2; transform(str1.begin(), str1.end(), str1.begin(), ::toupper); transform(str2.begin(), str2.end(), str2.begin(), ::tolower); cout

    최솟값과 최댓값 표현하기

    #include #include // 자료형의 최댓값과 최솟값이 정의된 헤더 파일 int main() { char num1 = CHAR_MIN; // char의 최솟값 short num2 = SHRT_MIN; // short의 최솟값 int num3 = INT_MIN; // int의 최솟값 long num4 = LONG_MIN; // long의 최솟값 long long num5 = LLONG_MIN; // long long의 최솟값 // char, short, int는 %d로 출력하고 long은 %ld로 출력, long long은 %lld로 출력 printf("%d %d %d %ld %lld\n", num1, num2, num3, num4, num5); // -128 -32768 -2147483648 -..

    2016년 - Level1

    2016년 1월 1일은 금요일이므로 배열은 금요일부터 시작 day는 2016년 1~12월까지에 대한 일수다. 공식으로 간단하게 풀 수 있는 문제다. #include #include using namespace std; string solution(int a, int b) { string week[7]{"FRI","SAT","SUN","MON","TUE","WED","THU"}; int day[]{31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; int val=0; for(int i=0;i week[4] = "TUE" }

    [3] 네트워크

    #include #include using namespace std; bool vis[1000]{false}; void dfs(vector computers, int start) { vis[start] = true; for (int i = 0; i < computers[start].size(); i++) { if (!vis[i] && computers[start][i]) dfs(computers, i); } } int solution(int n, vector computers) { int answer = 0; for (int i = 0; i < n; i++) { if(!vis[i]) { dfs(computers, i); answer++; } } return answer; }