no image
백트래킹을 진법 으로 변경해서 사용하기
모든 조합을 다 확인해보고 싶을 때 보통 백트래킹을 쓴다. 하지만 사용하기 힘들 수도 있다. 1. 변수들이 가질 수 있는 값이 여러 개일 경우에 2. 모든 조합을 다 확인해보고 싶은데 변수끼리는 서로 독립적일 때. 방향이 4개일 때 4진법을 쓸 수 있다. 이때 카메라 1개당 방향이 4개를 가질 수 있고 카메라가 3개가 있을 경우에는 4^3 = 64 4진수의 자릿수를 추출해서 방향을 정할 수 있다. 8진수 나누기 (8진수 곱하기) 계산하는 방법 4진법을 적용할 때, 코드로는 아래와 같이 사용하면 된다. 1 2 int dir = value % 4; value /= 4; cs
2024.03.08
[C++] cin 입력 시 공백 포함 으로 입력 받기
헤더파일 필요 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 /* 공백을 받을 수 없다. */ string s; cin >> s; /* ================== */ int n; cin >> n; // 이전 입력에서 엔터 처리가 존재할 경우 ignore 함수를 먼저 처리해준다. cin.ignore(); /* 공백을 받을 수 있다. */ string s; getline(cin, s); // 해당 방식으로 공백 포함 입력 가능. cs cin.ignore() 이 없을 경우 cin >> n; 에서 엔터 처리가 들어가면서 즉시 getline 함수가 처리된다. 그래서 이전 입력에 엔터 입력이 있을 경우 cin.ignore() 함수를 라인 입력 전에 처리해줘야한다.
2024.01.17
[힙] 최소힙/최대힙/커스텀정렬힙
힙 : 이진 트리 자료구조 index = 0 은 반드시 루트 노드를 의미한다. index 번째 노드의 자식 노드 = index * 2 + 1(왼쪽), index * 2 + 2(오른쪽) index 번째 노드의 부모 노드 = (index - 1) / 2 부모 노드는 항상 자식 노드보다 작거나 같다(최소힙), 크거나 같다(최대힙) 최소힙/최대힙 모두 탐색 시복 O(1) 삽입/삭제 시복 O(logn) 삽입 = 일단 제일 끝 부분에 원소를 추가한다. 이후에 최소/최대 규칙에 따라 재정렬한다. 삭제 = 반드시 최상단 노드(루트노드)가 빠지게 된다. 이후에 제일 끝 부분 원소를 루트 노드로 채운다. (옮긴다) 최상단 노드부터 시작해서, 자식 노드와 비교해가며 알맞는 위치를 찾아간다. (재정렬) 최대힙 (디폴트) 부모..
2024.01.15
no image
[C++] 함수 객체와 임시 객체
함수 객체 : ( ) 연산자 오버로딩을 사용해서 객체를 함수처럼 쓰는 문법 보통 operator( ) 오버로딩 함수 내부에 인라인화를 시켜서 호출 시에 임시 메모리에 들어가도록 의도한다. 하지만 미리 객체를 생성해놓고 필요할 때 사용하는 것이므로 Stack 영역이든 어디든간에 결국 메모리를 사용하는 구조이다. ▼ 함수 객체 예시 더보기 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 class CSortRule { public: virtual bool operator()(int a, int b) = 0; };..
2023.11.23
no image
[펌] 생성자 소멸자 관련
일부 멤버 함수들은 C++에서 클래스 안에 직접 선언해 넣지 않으면 컴파일러가 자동으로 선언해주도록 되어 있습니다. 바로. 1. 복사 생성자(copy constructor) 2. 복사 대입 연산자(copy assignment operator) 3. 소멸자(destructor) 4. 기본 생성자 (선언 해놓지 않았다면) 가 있습니다. 컴파일러가 만드는 함수의 형태는 모두 기본형이다. 모두 public 멤버이며 inline 함수입니다. class Player {}; 이렇게 선언한 클래스와 아래와 같이 선언한 클래스가 대동소이하다는 것입니다. class Player { public: Player() // 기본생성자 {} Player(const Player& rhs) //복사 생성자 {} ~Player() //..
2023.08.19
no image
[BT] 요약
각 노드들은 자신의 상태를 반환해야 합니다 Selector는 자식 노드를 실행하여 이 중 하나라도 True를 리턴하면 True를 리턴 > Selector Node는 자식 노드 중에서 처음으로 Success 나 Running 상태를 가진 노드가 발생하면 그 노드까지 진행하고 멈춥니다. 그러므로 Evaluate() 메소드 구현은 아래와 같습니다. 1. 자식 상태: Running일 때 -> Running 반환 2. 자식 상태: Success 일 때 -> Success 반환 3. 자식 상태: Failure일 때 -> 다음 자식으로 이동 Sequence는 모든 자식 노드가 True를 리턴할 때 True를 리턴 (Sequence는 자식 중 하나라도 False면 False를 리턴) > Sequence Node는 자식..
2023.08.18
데이터 값이 갑자기 지수승으로 바뀌는 경우
여러 가지가 있긴 한데 하나씩 확인 중 1. 파일입출력에서 지수승 뜨는 값은 보통 값이 0 인 경우가 많음. 2. long 을 float 에 넣을 때 지수승으로 바뀔 수 있음 --> 메모리 구조가 달라서 값이 날아가는 것 같음. ex. long startX = (m_Size) * -1; ulong startGap = 0; float posX = startX + startGap;
2023.04.03
MFC 윈도우 창 분할 시 에러날 때
윈도우창 분할할 때 빨간 에러박스 뜰 때 하위로 넣을 창의 속성이 child 인지 확인해볼 것.
2023.03.03
no image
시간복잡도 BigO 표기법 정리
BigO : 함수에서 가장 영향력이 큰 부분이 어디인가? > 데이터 수의 증가에 따른 연산 횟수의 증가 패턴이 어떠한가? 를 표기하는 방법 cf. 영향력이 어느 것이 더 큰가? 를 판단할 때 참고할 것 n + logn 일 경우 log 는 값이 커질 수록 영향력이 미미해지는데 (그래프 생각해보셈) n은 값이 커질 수록 그대로 커진다. 그래서 n 이 logn 보다 영향력이 더 크다. ex. O(n^2) 의 경우 : 연산 횟수의 증가 패턴이 n^2 를 벗어날 수 없다. O(1) 연산 횟수가 고정인 알고리즘을 상징 : 상수 빅오 데이터량 상관없이 무조건 연산이 3회 처리되어도 O(1) 로 표기한다. (상직적 사용) O(logn) 데이터 수의 증가량에 비해서 연산 횟수의 증가율이 매우 낮은 형태의 알고리즘을 상징..
2022.11.12
[C++] C++ 스타일 파일입출력
fin 은 자동 개행을 한다 read / wirte 는 개행을 하지 않는다 C++ 스타일 파일 입출력을 사용하려면 아래 헤더파일을 추가해야한다 1. 파일에 쓰기 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 #include using namespace std; class CPlayer { public: void private: char* m_pName; int m_iHp; } void SaveData() { ofstream fout; // 파일 열기 // std::ios_base::binary : 바이너리 모드 fout.open("PlayerData.txt", std::ios_base::binar..
2022.11.12
[C] C 스타일 파일입출력
C 스타일 : 자료형 하나씩 저정해도 되지만 보통 구조체로 저장한다. > 한 번에 데이터를 모아서 저장할 수 있어서 C 스타일 파일 입출력을 사용하려면 아래 헤더파일을 추가해야한다 1. 파일에 쓰기 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 #include using namespace std; #define MAX_NAME_LENGTH = 32; struct SAVE_DATA { char arr[MAX_NAME_LENGTH]; int iHp; } void SaveData() { FILE* pWriteFile = nullptr; // 파일 열기 // b : 바이너리 fopen_s..
2022.11.12
[C] 문자열 상수
char *test = "abcdef"; 와 char test[] = "abcdef";의 차이점 두 가지의 차이를 이야기 하기에 앞서서 "abcdef"에 대해 짚고 넘어갑시다. "abcdef"란 코드는 컴퓨터가 프로그램을 메모리에 로드할 때 읽기 전용 메모리에 로드되는 문자열 상수입니다. 문자열 상수의 주소란 말이죠. 참고로 읽기 전용 메모리에는 프로그램 코드 라던가 상수가 로드 됩니다. 그럼 돌아와서 문자열 상수 주소를 char *test인 포인터에 넣느냐 아니면 char test[]인 배열에 넣느냐가 차이점 이군요. 둘의 차이는 다음과 같습니다. 1. char *test = "abcdef"; - 포인터에 문자열 상수를 할당합니다. 따라서 문자열을 참조 할 수는 있지만 값을 바꾸지는 못합니다. 문자열이..
2022.10.23
[UE] UINTERFACE 와 FORCEINLINE
UINTERFACE C++ 인터페이스인데 언리얼 오브젝트임 uclass 매크로를 사용 등.. cdo나 클래스 계층 정보를 가지고 있음 FORCEINLINE 길지않은 함수일 경우 인라인으로 써주는게 좋다 ( return bool 같은 한 줄짜리 함수 ) 크거나 복잡한 태스크를 수행하는 함수의 경우 함수 호출의 오버헤드는.. 함수가 실행되는데 걸리는 시간과 비교할 때 중요하지 않다. 그러나, 일반적으로 사용하는 작은 함수의 경우 함수 호출에 필요한 시간이 실제로 함수 코드를 실행하는데 필요한 시간보다 훨씬 많은 경우가 있다 ( 배보다 배꼽이 큰 경우 ) 이로 인해 성능 저하가 일어날 수 있음 인라인 함수로 만들게 되면.. 함수 호출이 자체의 내용이 복사본으로 대체되어 함수 오버헤드가 발생하지 않는다. ( 함..
2022.06.20
[UE] 애니메이션 관련 정리
BS 는 두 가지가 있다 블렌드 스페이스 1D > 분할 기준(축)이 1개 블렌드 스페이스 > 분할 기준(축)이 2개 USkeletalMeshComponent > BP 에 붙는 스켈레탈 메시 컴포넌트. > 컴포넌트 내에서 스켈레탈 메시를 적용할 수 있음 - BP 로 만들지 않고, C++ 클래스만으로도 사용가능. ( C++ 클래스 내부에서만 사용할 경우.. 시각적으로만 안보이는 것 뿐이지, 클래스 내부에 선언된 컴포넌트를 통해 스켈레탈 메시를 적용할 수 있는 거임 ) USkeletalMesh > 진짜 스켈레탈 메시 Animation/AnimMontage.h > UAnimMontage 를 가지고 있는 헤더파일 UAnimMontage > 애니메이션 몽타주 클래스 이름 > 에디터에서는 [메뉴] 애니메이션 ▷ 애님..
2022.06.20
no image
[UE] USceneComponent 와 PrimitiveComponent
UActorComponent 씬에 올릴 수 있는 것들은 모두 액터가 기반이 되어야하며 이 액터들은 각각 다른 유형의 컴포넌트들을 가지게 되는데, 이 모든 컴포넌트에 대한 베이스 클래스이다. 언리얼 엔진에서는 1. 트랜스폼 정보를 가진 액터 컴포넌트를 Scene Component 라고 한다 2. 렌더링 정보를 가진 액터 컴포넌트를 Primitive Component 라고 한다 USceneComponent Transform 정보를 가진다. Actor 또는 USceneComponent 들의 Hierarchical Attachment - 부착을 지원한다. ( 하이어라키 계층 구조를 지원한다 ) 렌더링과 자체 콜리전을 가지지 않는다. 더보기 예를 들어, BP 에 Box 콜리전과 Text 렌더링을 한다고 하자. 사..
2022.05.09