분류 전체보기 115

백준 13302 : 리조트 (C++)

https://www.acmicpc.net/problem/13302 처음엔 N이 100 이하인 것을 보고 백트래킹을 생각했다.  그러나 곧 시간 초과가 날 것을 알았는데, 왜냐하면 매일 일일 이용권/3일 이용권/5일 이용권/쿠폰 사용의 4지선다를 선택하므로,약 4^100 번의 계산이 필요할 것이기 때문이다. 그리고 또 다른 해법으로 DP를 떠올렸다.처음엔 int dp[현재 일 수][3일권 잔여일 수][5일권 잔여일 수][보유 쿠폰 개수]이런식으로 dp 배열을 복잡하게 짜는 것을 고려했는데, 천천히 생각해보면 그럴 필요가 없다. 풀어 말하자면, 이 문제에서는 5일권이 하루 남은 상황에서 3일권을 산다던가, 4일 연속으로 리조트를 이용하고자 하면 5일권을 산다던가,이런 이용권 사용기간이 겹치는 상황을 고려할..

알고리즘 16:13:14

백준 16565 : N포커 (C++)

https://www.acmicpc.net/problem/16565 생각의 흐름:   소스 코드:#include #include #include #include using namespace std;#define int long long#define MOD % 10007int N;int dpC[53][53];int dpF[53][53];int C(int n, int r){ if (dpC[n][r] != -1) return dpC[n][r]; if (n == r || r == 0) { return dpC[n][r] = 1; } return dpC[n][r] = C(n - 1, r - 1) + C(n - 1, r);}// n장 중 k장을 포카드 없이 뽑는 경우의 수int F(int n, int k){ if..

알고리즘 2025.01.23

[언리얼 엔진 5] 가비지 컬렉션(+유니티와의 차이), 스마트 포인터

C++에는 가비지 컬렉션 기능이 없기 때문에, 언리얼 엔진에서는 이를 자체적으로 만들어 사용한다. 가비지 컬렉션은 리플렉션 시스템에 의존하는 엔진 내 기능 중 하나이다.리플렉션 시스템에 대해 자세한 내용은 https://ciel45.tistory.com/127 [언리얼 엔진 5] 리플렉션 시스템리플렉션이란, 프로그램이 실행 중 자기자신을 조사하는 기능을 의미한다. 에디터의 디테일 패널, 직렬화, 가비지 컬렉션, 네트워크 리플리케이션, 블루프린트/C++ 간 커뮤니케이션 등 엔진 내ciel45.tistory.com 가비지 컬렉션이란?우리가 C++로 동적 할당을 사용할 때 new, delete를 사용하는데, 실수로 사용하지 않는 객체에 delete를 안하면 메모리 누수가 발생한다.또한 실수로 사용 중인 객체를..

[언리얼 엔진 5] 리플렉션 시스템

리플렉션이란, 프로그램이 실행 중 자기자신을 조사하는 기능을 의미한다. 에디터의 디테일 패널, 직렬화, 가비지 컬렉션, 네트워크 리플리케이션, 블루프린트/C++ 간 커뮤니케이션 등 엔진 내 다수의 시스템의 기반이 되는 시스템이다. 언리얼 엔진 내에서는 그래픽 용어와 구분짓기 위해서 프로퍼티 시스템이라고 부르기도 한다. 클래스 / 변수 / 함수에 리플렉션 매크로를 붙여주면 해당하는 리플렉션 객체가 생성되는데, 각 매크로마다 어떤 객체가 생성되는 지는 다음과 같다.UCLASS (리플렉션되는 클래스임을 의미)UCLASS 매크로를 붙여준 클래스는 해당 클래스를 설명하는 UClass 객체가 런타임에 생성된다.해당 UClass 인스턴스가 곧 CDO와 같다.또한 각 UCLASS 인스턴스는 자신의 부모 클래스를 가리키..

[OpenGL] 게임 엔진 개발 (10) - Terrain Collision

플레이어가 이동할 수 있게 되었으므로, 터레인 위에서 자연스럽게 움직일 수 있도록 플레이어와 터레인 간 콜리전을 구현해볼 것이다. 사실 Player 클래스에는 이미 관련 코드가 짜여져 있다.bool Player::Move(float deltaTime, Terrain* terrain){ // 회전 GLfloat* currRot = model->GetRotate(); float rotation = currTurnSpeed * deltaTime; float newRotY = currRot[1] + rotation; // new rotY if(newRotY > 180) newRotY -= 360.f; if (newRotY SetRotate(newRot); // 이동 GLfloat* currPos = model..

[OpenGL] 게임 엔진 개발 (9) - 플레이어 이동

참조 : https://www.youtube.com/watch?v=d-kuzyCkjoQ&pp=ygURb3BlbmdsIHBsYWVyIG1vdmU%3D 지금까지 플레이어 모델이 항상 A포즈로 서있기만 했는데, 이제 조작을 통해 맵 위로 다닐 수 있도록 할 것이다. 우선 Player 클래스를 새로 만들었다. Player.h#pragma once#include "glm/glm.hpp"class Model;class Terrain;class Player{public: Player(Model* model); void HandleInput(bool* keys, float deltaTime); bool Move(float deltaTime, Terrain* terrain); float GetRotY(); Model*..

[OpenGL] 게임 엔진 개발 (8) - Terrain

참조 : https://learnopengl.com/Guest-Articles/2021/Tessellation/Tessellation LearnOpenGL - TessellationTessellation Guest-Articles/2021/Tessellation/Tessellation Tessellation Chapter II: Rendering Terrain using Tessellation Shaders & Dynamic Levels of Detail In order to complete this chapter, you will need to be able to create an OpenGL 4.0+ context. This slearnopengl.comlearnopengl.com에 테셀레이션을 활용..

[OpenGL] 게임 엔진 개발 (7) - Normal Mapping

이번엔 Normal Mapping을 추가해보았다. Normal Mapping이란, 버텍스를 늘리지 않으면서 표면의 복잡성을 취하는 기술이다. 생각해보면, 우리가 처음 텍스쳐를 쓴 이유도 물체 표면의 컬러의 복잡함을 구현하기 위해 버텍스를 여러개 쓰기보다는, 그걸 텍스쳐라는 독립적인 자료구조에 저장하기 위한 것이었다. Normal Map도 이와 똑같다. 다만, 텍스쳐라는 자료구조에 저장하는 것이 컬러 정보가 아닌 normal 정보인 것이다. Normal Mapping의 가장 대표적인 예시이다. 고전적인 방식대로 우측의 결과물을 구현하고자 한다면, 벽돌이 들어가고 나오는 부분마다 버텍스를 포지션을 달리해서 왕창 심어줘야 했겠지만, normal map의 사용을 통해 기존과 마찬가지로 버텍스 4개만 사용하고도 ..

[OpenGL] 게임 엔진 개발 (6) - Scene Hierarchy

전체 소스코드:https://github.com/sys010611/YsEngine  씬에 배치될 게 더 많아지기 전에 Scene Hierarchy 창을 간단하게 만들어보았다. UI 작업에 들어가기 전, 게임 오브젝트들(Model, Light 등)을 한꺼번에 다루는 클래스가 있어야겠다는 생각이 들었다.게임 오브젝트들을 다루는 다른 클래스들은 최대한 해당 클래스에만 의존하도록 하고 싶다. (DIP) DIP에 대한 자세한 내용은https://ciel45.tistory.com/22 [UE5] 블루아카이브 TPS게임 개발일지 (10) - 사격 기능 구현 준비 작업 + DIP사격 애니메이션까지는 만들어 두었으므로, 실제로 총이 발사되는 메커니즘을 만들고자 한다. 우선 발사를 구현하는 데에는 두가지 방법이 있다. 라..