전체 글 403

[C++] 지역변수, 전역변수, 동적변수란? malloc과 new의 공통점 차이점은?

지역변수 static - Stack영역에 저장되고, 특정 함수나 특정 스코프 내에서 선언되어 사용된다. - 즉, Block화 되어있는 공간에 선언된 변수를 의미 - 최초 할당되는 호출 시점에 생성된다. 전역변수 extern - Data영역에 저장되고, 프로그램 전체에서 사용할 수 있는 변수로 함수 외부에서 선언된다. - static 변수, extern 변수나 클래스 외부에 선언된 변수를 의미 - 컴파일이 완료되었을 때(프로그램이 시작될 때) 생성된다. 동적변수 - 런타임 중에 new 나 malloc을 이용하여 동적으로 메모리가 할당된 변수 - Heap 영역에 저장된다. malloc과 new의 공통점 - 사용할 연속적인 메모리 공간을 할당한다. - 메모리를 할당하고 free와 delete로 메모리를 해제해..

[Unreal] 가비지 컬렉션 (Garbage Collection)

정의 가비지 컬렉션이란 더이상 참조되지 않거나, 명시적으로 소멸을 예약시킨 UObject를 주기적으로 정리하는 기능이다. 가비지 컬렉션의 필요성 1. 메모리 누수 2. 댕글링 포인터(허상 포인터)의 발생 3. 미정의 동작 이러한 실수를 피할 수 있도록 필요 없어진 객체(가비지)는 알아서 삭제해주는 가비지 컬렉션이 필요하다. 언리얼의 가비지 컬렉션이 적용되는 오브젝트 1. UPROPERTY 레퍼런스를 유지하는 오브젝트 2. TArray, TMap 같은 언리얼 엔진 컨테이너 클래스로 저장된 오브젝트 안에 UObject 인스턴스를 저장하고 있을 때 1️⃣ 참조 카운터 방식의 가비지 컬렉션 C++의 shared_ptr이나, 언리얼의 TSharedPtr같은 스마트 포인터를 이용하여 단순한 가비지 컬렉션을 이용할 ..

[Unreal] 리플렉션(Reflection)

정의 리플렉션은 프로그램이 실행시간에 자기 자신을 조사하는 기능이다. C++는 어떠한 형태의 리플렉션도 지원하지 않기 때문에 기본적으로 컴파일 타임에만 타입 정보가 존재한다. 이때, 언리얼의 리플렉션을 이용하면 컴파일 타임에만 존재하던 타입 정보를 런타임에 들여다볼 수 있게 해준다. 부가설명 언리얼은 자체적으로 C++클래스, 구조체, 함수, 멤버변수, 열거형의 관련된 정보들을 수집, 질의, 조작하는 별도의 리플렉션 시스템이 구축되어 있다. 전형적으로 이러한 리플렉션을 "프로퍼티 시스템"이라고 부른다. (리플렉션은 그래픽 용어이기도 해서 헷갈릴 수 있다) 리플렉션 시스템에 보이도록 했으면 하는 유형이나 Property에 주석을 달아주면 UHT가 해당 프로젝트를 컴파일할 때 해당 정보를 수집하게 된다. 게임..

[프로그래머스/C++] 네트워크 - DFS/BFS

네트워크 문제 설명 네트워크란 컴퓨터 상호 간에 정보를 교환할 수 있도록 연결된 형태를 의미합니다. 예를 들어, 컴퓨터 A와 컴퓨터 B가 직접적으로 연결되어있고, 컴퓨터 B와 컴퓨터 C가 직접적으로 연결되어 있을 때 컴퓨터 A와 컴퓨터 C도 간접적으로 연결되어 정보를 교환할 수 있습니다. 따라서 컴퓨터 A, B, C는 모두 같은 네트워크 상에 있다고 할 수 있습니다. 컴퓨터의 개수 n, 연결에 대한 정보가 담긴 2차원 배열 computers가 매개변수로 주어질 때, 네트워크의 개수를 return 하도록 solution 함수를 작성하시오. 제한사항 컴퓨터의 개수 n은 1 이상 200 이하인 자연수입니다. 각 컴퓨터는 0부터 n-1인 정수로 표현합니다. i번 컴퓨터와 j번 컴퓨터가 연결되어 있으면 compu..

[백준/C++] 12015번 : 가장 긴 증가하는 부분 수열 2 (LIS 수열 문제)

가장 긴 증가하는 부분 수열 2 문제 수열 A가 주어졌을 때, 가장 긴 증가하는 부분 수열을 구하는 프로그램을 작성하시오. 예를 들어, 수열 A = {10, 20, 10, 30, 20, 50} 인 경우에 가장 긴 증가하는 부분 수열은 A = {10, 20, 10, 30, 20, 50} 이고, 길이는 4이다. 입력 첫째 줄에 수열 A의 크기 N (1 ≤ N ≤ 1,000,000)이 주어진다. 둘째 줄에는 수열 A를 이루고 있는 Ai가 주어진다. (1 ≤ Ai ≤ 1,000,000) 출력 첫째 줄에 수열 A의 가장 긴 증가하는 부분 수열의 길이를 출력한다. 예제 입력 1 6 10 20 10 30 20 50 예제 출력 1 4 LIS (최장 증가 부분 수열) 유형에서 시간제한이 있는 문제를 새롭게 풀어보았다. ..

[백준/C++] 11659번 : 구간 합 구하기 (누적합 문제)

구간 합 구하기 문제 수 N개가 주어졌을 때, i번째 수부터 j번째 수까지 합을 구하는 프로그램을 작성하시오. 입력 첫째 줄에 수의 개수 N과 합을 구해야 하는 횟수 M이 주어진다. 둘째 줄에는 N개의 수가 주어진다. 수는 1,000보다 작거나 같은 자연수이다. 셋째 줄부터 M개의 줄에는 합을 구해야 하는 구간 i와 j가 주어진다. 출력 총 M개의 줄에 입력으로 주어진 i번째 수부터 j번째 수까지 합을 출력한다. 제한 1 ≤ N ≤ 100,000 1 ≤ M ≤ 100,000 1 ≤ i ≤ j ≤ N 예제 입력 1 5 3 5 4 3 2 1 1 3 2 4 5 5 예제 출력 1 12 9 1 누적합 문제를 처음 풀어봤다. 처음엔 단순 for문을 이용한 합계를 구해 시간초과가 발생했다. #include #incl..

[UE4] EnemyAI -8 : 회피(Avoid) - EQS, Warp (UEnvQueryContext)

원거리 Enemy는 Target이 일정범위 이상 가깝게 다가오면 회피를 수행하도록 구현했다. 이때, 회피는 플레이어가 사용하던 Warp 무기를 사용하였다. 💻 DoAction_Warp 클래스 수정하기 플레이어만 사용하던 DoAction_Warp 클래스를 Enemy도 함께 사용하기 위해 조금 수정해주었다. 공격을 시작하는 Begin_DoAction 함수에서 PlayerController의 NULL 판단을 통해 해당 함수를 호출하는 Owner가 플레이어인지, Enemy인지 구분하였다. Enemy인 경우, Behavior 컴포넌트에 블랙보드 키 값으로 저장해둔 Avoid Location을 불러와 캐릭터의 위치를 변경해주었다. 위에서 말한 블랙보드의 회피 위치 키 값은 Vector 자료형으로 선언하였다. 여기서..

🎮Unreal4/C++ 2023.08.09

[UE4] EnemyAI -7 : 원거리 Enemy(Range), Bow

원거리 공격을 수행하는 Range EnemyAI를 구현해보았다. 무기는 활을 이용하여 공격하도록 만들었다. 💻 Range Service Range Enemy의 비헤이비어 트리를 구성하기 앞서 BTService 를 상속받는 CBTService_Range 클래스를 생성하였다. 근거리 Enemy(Melee)와 달리 원거리 몬스터는 공격 범위가 아닌 회피 범위(Avoid Range)를 변수로 갖는다. Service 클래스에서 주기적으로 호출되는 TickNode 함수에선 Avoid의 범위를 눈으로 파악할 수 있는 실린더 라인을 그리거나, Enemy AI의 상태(aiState)를 변경하는 소스코드를 작성하였다. Enemy가 Hitted 상태라면 SetHittedMode 상태로 설정하고, 블랙보드의 Target 객체..

🎮Unreal4/C++ 2023.08.09

[Unreal] 서비스 노드란? (BTService)

정의 서비스 노드는 비헤이비어 트리에서 사용되는 노드 중 하나로,백그라운드 작업을 수행하며 AI 정보를 업데이트시키는 작업을 수행합니다. 주로 어떤 조건이나 상태가 만족되는 동안 주기적으로 실행되며, 해당 조건이나 상태를 확인하거나 업데이트 하는 데 사용됩니다. 특징 비헤이비어 트리의 기본 분기가 활성화되면 서비스 노드가 실행되고, 태스크 노드들과 달리 작업 결과를 반환하지 않습니다. 따라서 실행 흐름에 직접적인 영향을 끼치지 않습니다. 용도 일반적으로는 TickNode를 정기적으로 호출하고 수행 결과를 블랙보드에 저장하여 사용합니다. 또는 게임 상태를 모니터링하거나 업데이트 하는 데 사용되어 비헤이비어 트리를 다양하고 유연하게 제어하는 데 도움을 줄 수 있습니다. 언리얼 문서에 적힌 주의사항 Servi..

[백준/C++] 1966번 : 프린터 큐 (시뮬레이션, 큐 연습)

프린터 큐 문제 여러분도 알다시피 여러분의 프린터 기기는 여러분이 인쇄하고자 하는 문서를 인쇄 명령을 받은 ‘순서대로’, 즉 먼저 요청된 것을 먼저 인쇄한다. 여러 개의 문서가 쌓인다면 Queue 자료구조에 쌓여서 FIFO - First In First Out - 에 따라 인쇄가 되게 된다. 하지만 상근이는 새로운 프린터기 내부 소프트웨어를 개발하였는데, 이 프린터기는 다음과 같은 조건에 따라 인쇄를 하게 된다. 현재 Queue의 가장 앞에 있는 문서의 ‘중요도’를 확인한다. 나머지 문서들 중 현재 문서보다 중요도가 높은 문서가 하나라도 있다면, 이 문서를 인쇄하지 않고 Queue의 가장 뒤에 재배치 한다. 그렇지 않다면 바로 인쇄를 한다. 예를 들어 Queue에 4개의 문서(A B C D)가 있고, 중..

[CS] CPU 간단 총정리

CPU 구성요소 제어기능 IR: 현재 수행중인 명령어의 저장소 Decorder: IR에 들어간 명령어를 해석하는 것 CU: 컨트롤 유닛, 해석한 명령에 따라 신호를 보내준다. 제어 유닛 연산기능 ALU: 산술 논리 연산 장치 AC: 연산 결과를 일시적으로 저장 기억기능 PC: 프로그램 카운터, 다음 수행할 명령의 번지 저장 MAR: 메모리 어드레스 레지스터, 현재 수행될 명령의 주소 MBR: 메모리 버퍼 레지스터, 기억장치로부터 주고 받을 데이터 전달기능 주소, 데이터, 제어 버스 명령 사이클 1. 명령 인출 2. 명령 해석 3. 데이터 획득 4. 명령 실행 - 인터럽트 병행성과 병렬성 병행성(Concurrency) : 1 Processor -> n Program 하나의 프로세스가 두 개 이상의 프로그램..

[백준/C++] 1541번 : 잃어버린 괄호 (그리디, 문자열 문제)

잃어버린 괄호 문제 세준이는 양수와 +, -, 그리고 괄호를 가지고 식을 만들었다. 그리고 나서 세준이는 괄호를 모두 지웠다. 그리고 나서 세준이는 괄호를 적절히 쳐서 이 식의 값을 최소로 만들려고 한다. 괄호를 적절히 쳐서 이 식의 값을 최소로 만드는 프로그램을 작성하시오. 입력 첫째 줄에 식이 주어진다. 식은 ‘0’~‘9’, ‘+’, 그리고 ‘-’만으로 이루어져 있고, 가장 처음과 마지막 문자는 숫자이다. 그리고 연속해서 두 개 이상의 연산자가 나타나지 않고, 5자리보다 많이 연속되는 숫자는 없다. 수는 0으로 시작할 수 있다. 입력으로 주어지는 식의 길이는 50보다 작거나 같다. 출력 첫째 줄에 정답을 출력한다. 예제 입력 1 55-50+40 예제 출력 1 -35 예제 입력 2 10+20+30+40..

728x90