분류 전체보기(65)
-
컵라면(그리디 알고리즘)
https://www.acmicpc.net/problem/1781 1781번: 컵라면 상욱 조교는 동호에게 N개의 문제를 주고서, 각각의 문제를 풀었을 때 컵라면을 몇 개 줄 것인지 제시 하였다. 하지만 동호의 찌를듯한 자신감에 소심한 상욱 조교는 각각의 문제에 대해 데드라 www.acmicpc.net 1. 각 케이스를 날짜대로 오름차순 정렬한다. 2. 현재 날짜를 0일이라고 생각한다. 3. 오름차순 정렬된 케이스를 선형탐색하여 현재 날짜보다 데드라인이 높다면 현재 날짜를 +1, 결과 우선순위 큐(오름차순)에 컵라면 갯수를 삽입해준다. 4. 결과 우선순위 큐의 Top에는 현재 날짜까지의 최적해에서 가장 적은 컵라면을 주는 케이스가 됨 5. 현재 날짜보다 데드라인이 낮거나 같은 케이스가 들어오면 결과 우선..
2022.10.04 -
라면 사기(그리디 알고리즘)
그리디 알고리즘(탐욕 알고리즘)은 알고리즘을 풀어나갈때 각 순간마다 최적인 답을 선택하여서 최적해의 근사값을 구하는 알고리즘이다. 그리디 알고리즘으로 추론된 답이 최적해임을 보장하기 위해선 문제가 두 가지 조건을 만족하여야 한다. 1. 탐욕적 선택 속성: 탐욕적인 선택이 언제나 최적해를 보장해야 함(특정 선택이 이후의 선택에 영향을 주지 않음). 2. 최적 부분 구조: 문제의 최적해는 부분 문제들의 최적해의 집합과 동일하여햐 함. https://www.acmicpc.net/problem/18185 18185번: 라면 사기 (Small) 라면매니아 교준이네 집 주변에는 N개의 라면 공장이 있다. 각 공장은 1번부터 N번까지 차례대로 번호가 부여되어 있다. 교준이는 i번 공장에서 정확하게 Ai개의 라면을 구..
2022.10.04 -
객체 지향 프로그래밍의 5원칙/5가지 특성
객체 지향의 5원칙 SOLID S 단일 책임 원칙(Single responsibility principle) - 한 클래스가 제공하는 모든 서비스는 하나의 책임을 수행하는데 집중되어야 한다. O 개방 폐쇄 원칙(Open/closed principle) - 소프트웨어의 모든 구성요소는 확장에는 열려있으나, 변경에는 닫혀있어야 한다. - 클래스를 설계할 때 변할 부분과 변하지 않을 부분을 구분해야 한다. L 리스코프 치환 원칙(Liskov substitution principle) - 클래스는 정확성을 깨뜨리지 않으면서 하위 타입의 인스턴스로 바꿀 수 있어야 한다. - 부모 클래스의 포인터에 해당 클래스의 자식 클래스를 할당하더라도 모든 기능이 정상적이어야 한다. I 인터페이스 분리 원칙(Interface ..
2022.09.26 -
Character(=Pawn)의 AddMovementInput()
'메인 플레이어 폰'의 움직임을 제어하는 방법은 크게 2가지로 볼 수 있다. 1. Actor의 Location을 직접 조정.(AddActorLocalOffset 등) 2. Character(=Pawn) C++ 클래스에 있는 AddMovementInput을 사용. 보통 캐릭터 C++클래스를 만들면 딸려오는 함수인 AddMovementInput 함수로 이동을 구현하였는데, 어느 강의에서도 DeltaTime으로 보정해준다는 말이 없어서 알아보기로 하였다. (DeltaTime: https://djgameprogramming.tistory.com/28?category=997144) Delta Time 언리얼 엔진의 C++ 클래스에서 AddActorLocalOffset, 혹은 SetActorLocation 함수는 ..
2022.09.20 -
Player Input
플레이어로부터 입력을 받기 위해선 언리얼 엔진의 프로젝트 세팅에서 입력에 대한 환경설정을 해주어야 한다. 입력 매핑을 설정할때 액션 매핑, 축 매핑 두 가지 종류의 매핑이 존재한다. -액션 매핑: 단일적인 입력을 감지한다. 액션 매핑에 바인딩된 함수는 입력을 감지할때만 호출된다. 코드에 따라 누를 때, 뗄 때, 더블클릭할 때, 누르고 있을 때 등등에 대한 상황을 감지할 수 있으며, 점프, 공격, 상호작용 등의 기능에 적합하다. -축 매핑: 연속적인 입력을 감지한다. 축 매핑에 바인딩된 함수는 입력이 없어도 매 프레임마다 값을 탐색하고 호출된다. 이동, 카메라 움직임 등의 기능에 적합하다. PlayerInputComponent의 BindAxis 또는 BindAction 함수로 특정 함수를 입력 매핑에 바인..
2022.09.13 -
Actor, Pawn, Character
Actor 레벨에 배치할 수 있는 오브젝트, 이동, 회전, 스케일과 같은 3D Transform을 지원하는 범용 클래스. Pawn 플레이어나 AI가 제어할 수 있는 Actor. 플레이어나 AI 개체에 대한 물리적 표현.(시각적 표현 뿐만 아니라 콜리전과 같은 물리적 표현도 모두 포함) Character CharacterMovementComponent, CapsuleComponent, SkeletalMeshComponent의 추가를 통해 Pawn 보다 복잡한 애니메이션을 처리하기 위해 고도로 특화된 Pawn. Actor Pawn Character 이동 X O O (플레이어, AI)제어 X O O 애니메이션 X X O
2022.09.13 -
Delta Time
언리얼 엔진의 C++ 클래스에서 AddActorLocalOffset, 혹은 SetActorLocation 함수는 해당 액터의 로케이션 값을 변경할 수 있다. 단순 로케이션 변경이라는 결과를 도출할때는 적합하지만 캐릭터의 이동과 같은 부드러운 로케이션의 변경을 위해선 Tick 함수나 축 매핑에 바인딩하여 사용하여야 한다. 이렇게 사용했을 때 액터의 움직임을 변경하는 함수는 매 프레임=Frame 마다 호출되게 된다. 하지만 이렇게 구현을 했을 때 캐릭터의 이동하는 거리(=함수의 호출 빈도)가 프레임에 종속되어버린다. Tick 함수에 특정 액터를 1만큼 이동하도록 구현했다고 해보자 30fps(초당 프레임)의 성능을 보장하는 A 컴퓨터와 60fps의 성능을 보장하는 B 컴퓨터가 있을때, 동일한 코드일지라도 A컴..
2022.09.13 -
전방 선언(Forward Declaration)
언리얼 엔진에서 C++ 클래스를 코딩할때 특정 클래스의 포인터 앞에 class를 붙여주는 경우를 볼 수 있다. 이것은 '전방 선언(Forward Declaration)'이라고 하며 헤더끼리의 의존성을 최소화 하기 위해 쓰여지는 방법이다. Pawn 클래스에서 CapsuleComponent를 사용하려고 하면 UCapsuleComponent 클래스에 대한 정보가 필요하다. 이때 가장 먼저 생각할 수 있는 방법은 Pawn의 헤더파일(.h)의 상단에 CapsuleComponent의 헤더를 include하는 방법이다. 하지만 해당 방법을 이용했을 때 Pawn 클래스의 헤더에 CapsuleComponent의 헤더가 추가되게 되면서 Pawn 헤더 자체의 크기가 늘어나게 된다. 또한 CapsuleComponent의 헤더..
2022.09.13 -
포인터
우리가 변수를 생성할때 이러한 데이터를 저장하기 위해 메모리에 저장할 공간을 할당받는다. 이 저장할 공간은 각각의 주소가 존재하며, 데이터의 주소값은 해당 데이터가 저장된 메모리의 시작 주소를 의미한다. int는 정수를 저장하는데 사용되는 변수명. char는 문자를 저장하는데 사용되는 변수명. 포인터는 주소값을 저장하는데 사용되는 변수명이다. 포인터에 사용되는 연산자는 주소 연산자(&), 참조 연산자(*) 두 가지가 있다. 주소 연산자(&)는 변수의 이름 앞에 사용되며 해당 변수의 주소값을 반환한다. 참조 연산자(*)는 이름이나 주소 앞에 사용하여, 포인터에 저장된 주소에 저장된 값을 반환한다. 포인터의 선언에도 사용되기도 한다. 포인터는 주소값을 저장하기 때문에 포인터를 참조하여 해당 주소의 데이터를 ..
2022.09.05 -
const, mutable
const constant위 약자로 사전적 의미는 '상수'를 뜻한다. C++에서 const 키워드는 해당 대상을 변경하지 않는 '상수'로 판단한다는 뜻. - const 비멤버 변수 두 선언은 동일하며, num은 const int로 변하지 못하는 상수가 되어서 num을 변경하려고 하면 에러가 발생. - const 멤버 변수 const 키워드를 사용할때는 반드시 초기화를 해주어야 한다. 멤버 변수를 const로 선언할때는 아예 선언과 동시에 초기화를 해주거나, 초기화 리스트를 사용하여야 한다. C 클래스는 const int인 num을 선언한 뒤 이후 생성자에서 num을 변경하려고 하였으므로 에러가 발생한다. - const 포인터 변수 기존 const 변수 선언법과 다르게 const 포인터 변수는 const의..
2022.09.01 -
백조의 호수(BFS 최적화)
- BFS를 사용하는 문제지만 매번 BFS를 처음부터 진행하면 TimeLimit 발생. - BFS를 사용하면서 갔던 노드에는 재방문하지 않도록 최적화가 필요한 문제. - 물, 백조 각각 큐를 만들어서 각각 BFS를 진행. - 백조 BFS의 초기값은 두 백조 중 하나의 좌표 - 백조 BFS에서 도달한 X 좌표들은 다음번 백조 BFS를 시작할 위치들임. - 2차원 bool 배열을 만들어서 백조 BFS에서 방문했던 위치에 대해 따로 기록하고 이미 방문한 좌표는 탐색하지 않음. - 백조 BFS에서 백조에 도달하면 반복문을 멈추고 해당 카운트값을 리턴. - 물 BFS의 초기값은 입력받았던 .(물)과 L(백조)의 모든 좌표 - 물 BFS에서 도달한 X 좌표들은 .(물)로 바꿔주고 다음번 물 BFS를 시작할 위치들임..
2022.08.31 -
Unreal Architecture
Unreal Architecture - C++를 사용하여 언리얼 엔진을 프로그래밍 할 때, 각 모듈은 다수의 C++ 클래스를 포함할 수 있다. - 모듈은 관련 클래스들의 모음, 언리얼 엔진에서 현재 사용중인 모듈은 '프로젝트명.Bulid.cs'에 작성됨. - 각 클래스는 Actor들과 Object들의 정의하고 있음.(C++와 비슷하다.) (https://docs.unrealengine.com/5.0/ko/programming-with-cpp-in-unreal-engine/) Refection - 프로그램이 런타임 시점에서 자기 자신의 정보, 구조를 관리, 수정 할 수 있게 액세스 하는 기능. - C++에선 지원하지 않아서 언리얼 엔진 자체적으로 구현되어있다. - 언리얼 엔진에선 공식적으로 프로퍼티 시스템..
2022.08.31