목록Categories (1096)
KoreanFoodie's Study
프로그래밍 대회에서 배우는 알고리즘 문제해결 전략(이하 종만북)을 읽으며 유용한 내용을 정리해 보도록 하겠습니다. 모든 내용을 요약하는 것은 아니며, 대회에 포커싱을 맞춘 부분은 다루지 않을 수도 있습니다. 알고리즘에 진심이시라면, 직접 구매하셔서 읽어보시는 것을 추천합니다! 핵심 : 1. 수행 시간 어림짐작은 유용하지만, 엄밀하지는 않으니 최적화 시에는 여러 인자들을 함께 고려해 보자. 2. 알고리즘의 정당성 증명은 해당 알고리즘의 통찰을 이해함에 있어 중요하다. 3. 알고리즘의 정당성 증명 방법은 귀납법, 반복문 불변식, 귀류법, 비둘기집의 원리, 구성적 증명 등이 있다. *챕터 2 에서는 한 번 되짚어 볼 만한 내용을 일부 발췌해 정리해 보겠습니다. 수행 시간 어림짐작하기 일반적으로 우리는 Time..
프로그래밍 대회에서 배우는 알고리즘 문제해결 전략(이하 종만북)에서 소개된 문제를 풀이합니다. 알고리즘에 진심이시라면, 직접 구매하셔서 읽어보시는 것을 추천합니다! 핵심 : 1. 기본적으로는 이중 for-loop 으로 풀 수 있으나, DP 를 사용하면 시간을 조금 단축할 수 있다. 2. 소수점 오차에 유의하자. 록 페스티벌 (난이도: 하, 문제 ID : FESTIVAL) 사실 2중 for-loop 만 돌리면 쉽게 풀 수 있는 문제이긴 하다. 따라서 따로 설명을 길게 적지는 않고, 코드에 주석을 조금 달아 두었다! 😄 #include #include "stdlib.h" using namespace std; int N, L; int days[1000]; int dp[1000]; double ans; doub..
프로그래밍 대회에서 배우는 알고리즘 문제해결 전략(이하 종만북)을 읽으며 유용한 내용을 정리해 보도록 하겠습니다. 모든 내용을 요약하는 것은 아니며, 대회에 포커싱을 맞춘 부분은 다루지 않을 수도 있습니다. 알고리즘에 진심이시라면, 직접 구매하셔서 읽어보시는 것을 추천합니다! 핵심 : 1. 프로그래밍은 문제 해결이다. 2. 간결하고 모듈화된 코드를 짜라. 이는 버그를 줄여주고 디버깅 효율을 높여준다. 3. 자주 범하는 실수에 대한 유형을 알아두자. 프로그래밍은 문제 해결이다. 1장에서는 알고리즘에 대한 코딩에 대한 저자의 철학과, 앞으로 다룰 주제에 대한 간략한 맛보기(?)가 제공된다. 거기에 배운 지 오래되어 기억의 저편에 묻혀 있거나, 생각해보면 좋은 꿀팁들에 대해서도 조언을 아끼지 않는다. 이번 글..
[언리얼] 어떤 개념 : 어떻게 하기 핵심 : 1. UObject 라면, UWorld::GetRealTimeSeconds() 함수를 사용할 수 있다. 2. C++ 클래스라면, FDateTime::Now() 를 쓸 수도 있다. 3. milisecond 를 원한다면 FDateTime::UtcNow() 를 쓰자. 1. UObject 일 경우 UWorld* World = GetWorld(); float PrevSeconds; float ElapsedSeconds; if (World) { ElapsedSeconds = MyWorld->GetRealTimeSeconds() - PrevSeconds; PrevSeconds = MyWorld->GetRealTimeSeconds(); UE_LOG(LogTemp, Warn..
언리얼 UI 최적화 핵심 : 1. UI 최적화를 위해서는 먼저 UI 구조와 렌더링 프로세스를 이해해야 한다. 2. UI 최적화의 핵심은 결국 Tick 이다. Tick 을 필요할 때만 호출하게 만들거나, Tick 당 담기는 연산의 크기를 줄여야 한다. 전자는 게임쓰레드와, 후자는 렌더링 쓰레드와 연관이 깊다. 3. 게임 쓰레드 최적화에는 Invalidation Box, Visibility, Widget Binding 등이 있고, 렌더링 쓰레드 최적화에는 Merging Batches, Retainer Box 등이 있다. 언리얼에서 UMG 를 이용한 UI 작업을 상당히 많이 하는데, 일정에 쫓기다 보니 프로젝트 차원에서 최적화를 고려하면서 만드는 경우가 잘 없는 것 같다는 생각이 들었다. 또한 최적화를 한다고..
2023년은 그 어느때 보다 더 빠르게 지나간 것 같다. 흔히 나이가 들면 들수록 시간이 더 빠르게 흘러간다지만, 2023년은 그런 것을 감안하더라도 조금 비상식적(?)으로 빠르게 지나가지 않았나 하는 생각이 든다. 사람들은 매년 장대한 목표를 설정하고, 새로운 계획을 세우지만 대부분의 계획은 한 여름밤의 꿈처럼 한 달이 채 지나기도 전에 잊혀지고 만다. 나 또한 그렇게 되지 않을까 하는 마음에, 이번에는 지난 한 해를 되돌아 보며 내가 무엇을 목표로 했고 어떤 것을 배웠는지 되돌아 보는 시간을 가지려 한다. 2023년의 목표 회고 회고를 하기 위해, 예전에 구글 드라이브에 정리한 목표를 다시 꺼내 왔다. 돌이켜 보면, 2023년은 '기본기 다지기'의 해로 보내기로 다짐했던 것 같다. 개발을 단순히 취미..
[C++ 게임 서버] 7-5. Procedure Generator 핵심 : 1. Python 을 이용해 Procedures 를 자동 생성해 보자. 우리는 이전에 BindParam/BindCol 을 이용해서 테이블에 접근을 하곤 했다. 이런 부분을 조금 더, 자동화 시키기 위해 ProcedureGenerator 를 만들어 보자. 우리는 XML 로부터, 테이블에 데이터를 추가하거나 조회하는 API 를 자동으로 만들어 줄 것이다. 먼저 XmlDBParser 가 필요하다. 이건 참고용이니, 접은 글에 넣도록 하겠다. 🙂 더보기 XmlDBParser.py import xml.etree.ElementTree as ET class XmlDBParser: def __init__(self): self.tables = {..
[C++ 게임 서버] 7-4. ORM 핵심 : 1. ORM 을 사용하면, DB 를 간편하게 관리할 수 있다. 이번 글에서는 간단한 ORM 을 만들어 보도록 하겠다. 참고로 ORM 이란... 라고 한다. 자세한 설명은 이 블로그를 참고하자. 음.. 일단 DB 모델을 표현하는 DBModel 과, 현재 DBModel 에 맞게 Table 을 구성해 주는 DBSynchronizer 클래스를 만들 것이다. 그런데... 이게 하나하나 설명하기에는 양이 많고, 굳이 암기할 필요는 없기에... 나중에 필요할 때 슬쩍(?) 들춰보는 것으로 하고, 예제 코드만 기록하고 넘어가도록 하겠다. 절대 귀찮아서 때우려고 하는게 아니다. 😅 더보기 DBModel #pragma once #include "Types.h" NAMESPAC..
[C++ 게임 서버] 7-3. XML Parser 핵심 : 1. DB 도 버전 관리가 필요하며, 따라서 테이블과 쿼리는 버전에 맞게 존재해야 한다. 이를 위한 XML Parser 를 만들어 본다. 프로젝트를 진행하다 보면 자연스럽게 버전 관리가 필요하다. 이는 사실 DB 에도 마찬가지인데, 어떤 버전에서는 특정 테이블에 특정 컬럼이 없다던지, 추후 버전에서 테이블이 추가된다던지 하는 경우가 생길 것이다. 따라서 쿼리도 그런 DB 의 변동에 맞게 내용물이 바뀌어야 하는데... 보통 이를 관리해 주는 직군이 DBA 이다(물론 서버 담당자가 하기도 한다). 우리는 앞으로 이런 DB 쿼리를 XML 로 관리한 다음, 실제로 GameServer 에서 쿼리를 날려줄 때 XML Parser 를 이용해 해당 쿼리가 자동..
[C++ 게임 서버] 7-2. DB Bind 핵심 : 1. TMP 를 활용하여 BindParam/BindCol 을 간략화해 보자. 이전에 DBConnection 을 만들면서, BindParam 을 이용해 데이터를 저장하고, BindCol 을 이용해 DB 에서 값을 조회했다. 그런데 사실 이런 함수들은 타입별로 만들어 줘야 한다. 그래서 DBConnection 에 다음 함수들을 추가하고, 기존 BindParam/BindCol 을 private 으로 빼 줬다. public: boolBindParam(int32 paramIndex, bool* value, SQLLEN* index); boolBindParam(int32 paramIndex, float* value, SQLLEN* index); boolBindP..