![[프로그래머스 C++] 혼자 놀기의 달인](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbkyBbP%2FbtsHTjcOksX%2FLZkS6hPM6MhOQjYOKA6jK1%2Fimg.png)
https://school.programmers.co.kr/learn/courses/30/lessons/131130문제의 설명을 간단하게 설명하자면 다음과 같다.1 ~ 100까지의 숫자중 원하는 숫자보다 작은 카드를 전부 골라 각각 상자에 넣는다.그 상자에 1부터 시작하는 인덱스 값을 부여한다.상자를 열어 그 안에 있는 카드에 적혀 있는 인덱스의 상자로 이동한다이미 열려있는 상자에 도달할 때 까지 3번을 반복한다.도달하면 지금까지 열었던 상자를 하나의 그룹으로 정한다.그룹이 2개 나올때 까지 진행하여 각 그룹에 속해있는 상자의 갯수를 곱한다.이를 진행하면서 최대로 나올 수 있는 값을 구하는 문제이다.입력으로 주어진 cards에서 시작할 수 있는 모든 값을 시도해보는 방법으로 구현하였다.각 시도마다 재귀형..
![[알고리즘] 힙 정렬](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMQrkw%2FbtsHLg8TR30%2FFwLRvUEygHjEFwzMDVBxx0%2Fimg.gif)
힙 정렬이란?최대 힙 트리나 최소 힙 트리를 구성해서 정렬하는 방법으로 기본적으로는 1차원 배열을 사용하여 구현하는 방식이다.내림차순 정렬을 할 때에는 최소 힙 트리를 구성하고, 오름차순 정렬을 할 때에는 최대 힙 트리로 구성한다.힙 정렬 알고리즘의 구현힙은 최상위 루트 노드로부터 시작하는 완전 이진 트리이다. 이 루트 노드에서 왼쪽과 오른쪽으로 각각 노드가 존재하고, 루트 노드를 부모 노드, 왼쪽 및 오른쪽 노드를 자식노드라고 말한다.부모노드의 인덱스가 i라고 한다면 왼쪽 자식노드는 2 * i 위치에 존재하고, 오른쪽 자식 노드는 2 * i + 1의 위치에 존재한다. 이진 트리를 만들면서 최대 힙, 자식 노드를 가지는 부모 노드를 구성해나가면서 점점 루트로 올라오는 순차적 단계를 이용하여 만들어 낼 수..
![[Unreal Engine C++] C++에서 Niagara System 스폰](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fccm3GR%2FbtsHHnFsAtT%2FDx4718o4bPNKZLAtOZeqsk%2Fimg.png)
필자가 프로젝트를 진행하면서 사용하였던 나이아가라 시스템을 C++로 스폰시키고 사용 후 디스폰시키는 방법, 나이아가라 시스템을 패키징 할 때 발생할 수 있는 문제를 수정하는 방식을 확인해보자Niagara System의 사용게임 개발 프로젝트를 진행하면서 게임 특성중 하나인 정신력 게이지를 회복시키는 아이템을 추가하기로 하였다.이 아이템은 촛불인데, 그 촛불에서 불이 나는 느낌을 내기 위해 나이아가라 시스템을 사용하고자 했다.에셋으로 받은 불 나이아가라 시스템을 이미터의 수치값을 조정하여 파란색으로 수정 및 무한 재생하게 수정해주었다.이를 C++에서 불러오고자 다음과 같은 코드를 작성하였다.// SanityRecovary.h#pragma once#include "CoreMinimal.h"#include "..
![[프로그래머스 C++] 가장 큰 수](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcHYrbv%2FbtsHFJXCSLV%2FcgJ4w5rMx4t99prfvyWAg0%2Fimg.png)
https://school.programmers.co.kr/learn/courses/30/lessons/42746?language=cpp정렬이지만, 조금은 다르다.원래는 왼쪽 기준으로 맨 처음 숫자를 고려해서 큰 수형식으로 배열하는 방식을 생각하였다.하지만 이는 코드상으로 구현하니 굉장히 복잡한 형식이기도 하고, 예외 처리 해야 할 것들이 많이 존재하였다.(ex. 자릿수가 같을 때 숫자비교, 다를 때 짧은 것이 먼저올 수도 있지만, 뒤에 오는 숫자들에 따라 긴 것이 먼저 올 수도 있음)그런 문제점이 존재해 다른 방식으로 이 문제를 풀 수 있었다.숫자들을 string으로 전환하여 각 숫자를 합쳐보았다.3 + 57과 57 + 3을 수행하면 각각 357, 573이 된다.합쳐보았을 때 573이 더 큰 수 이므로..
![[프로그래머스 C++] K번째 수](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd3hHAA%2FbtsHHoYn7hS%2Fr4JF5puTDq6OWjbv6kdHG0%2Fimg.png)
https://school.programmers.co.kr/learn/courses/30/lessons/42748정렬을 이용하는 문제이다.array의 값을 commands로 주어진 i, j, k값에 따라서 정리한 후, 그에 맞는 숫자를 return해주면 되는 간단한 문제이다. #include #include #include using namespace std;vector solution(vector array, vector> commands) { vector answer; vector temp; for (int n = 0; n
![[Unreal Engine C++] Online Subsystem을 활용한 멀티플레이 구현](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoU16v%2FbtsGMVDW6Xf%2Fyk4bIWGt98Ka2gekRwRtn0%2Fimg.png)
언리얼에는 온라인 서브시스템 Steam API를 통해 만든 게임을 밸브의 스팀 플랫폼에 출시하는 것이 가능하다. 그 기능을 이용해서 멀티 기능을 만들어보자 시작하기 전 준비 Online Subsystem을 사용하기 전, 프로젝트를 하나 생성해준다. 필자는 3인칭 게임에 적용하고자 했기 때문에 3인칭 게임으로 생성해주었다. 편집 - 플러그인에서 "OnlineSubsystem Steam"을 추가해준다. 그 뒤, 만들어진 (ProjectName).Build.cs에 "OnlineSubsystem" , "OnlineSubsystemSteam"을 추가해준다. PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "In..
![[Unreal Engine C++] 청크 개념을 이용한 랜덤 맵 생성 알고리즘](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMHFgS%2FbtsGez8A0l5%2Fpw9DAZyUaKzIqvk2cpO7g0%2Fimg.png)
이전 포스팅에서 말했듯이 BSP, MST를 이용한 랜덤생성 등등의 알고리즘을 사용하지 못하고 새롭게 생각한 아이디어인 청크 개념을 활용하여 랜덤 맵을 생성해보기로 하였다.C++로 구현해 보았던 과정 및 결과를 글에 적어본다.시작하기 전 - 설명청크란? 영어에서 사용하는 뜻은 '서로 밀접하게 연결된 단어들의 집합 ' 이다.코딩에 있어서는 하나의 큰 정보라고 생각해보자.필자가 만든 이 랜덤 맵에서 하나의 청크인 이 큰 정보는 작은 정보를 포함하고 있다.작은 정보는 위치가 어디인지와 이 곳에 무엇이 생성될 것인지, 어디로 이어지는지 등인 것이다.앞으로 작은 정보들이 더 추가될 수 있지만, 이 세개면 일단 기본적인 구성은 준비된 것이라고 생각하였다.만들기전에 준비하자 - 랜덤맵에 사용할 액터 생성먼저 맵 생성을..
![[Unreal Engine C++] 랜덤 맵 생성에 관한 아이디어들](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcpOaii%2FbtsGeM7mJ1Q%2FgrPSa4cEZLgQvGrgkAoUT0%2Fimg.png)
이번 졸업 작품 프로젝트에서 개인적으로 꼭 구현해보고 싶었던 알고리즘 중 하나가 랜덤 맵 생성 알고리즘 이였다.이를 생각하고, 구현해내기 전 아이디어와 과정들을 적어보고자 한다.구현을 시작하기 전..네이버 및 구글에서 언리얼 관련 내용을 검색해보았을 때, 툴 설명 및 기능들을 설명해주는 글을 어느정도 존재하지만 알고리즘을 설명하는 내용은 거의 없었다.또한 그 것을 한국어로 검색하였을 때 나오는 건 극히 일부분이였다..Procedural Map Generation라던가 절차적 맵 생성.. 랜덤 맵 생성... 등등을 검색하였지만 나오는 내용은 많이 없었지만 그 조금의 내용이라도 최대한 활용해서 구현해보고자 했다.생각의 시작 - BSP 알고리즘검색해보았을 때, 그 중에 가장 많이 나오는 것이 바로 BSP 알고..
![[백준 C++] 10815 : 숫자 카드](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcdpIaP%2FbtsFFKD0vNB%2F5K4h6kE5FdYVnwZNk5VkXk%2Fimg.png)
https://www.acmicpc.net/problem/10815 브루트포스 방식으로 모든 숫자 카드들을 비교하면 시간 초과로 해결하지 못하는 문제이다. 시간 단축을 위해 이분 탐색을 활용해 숫자 카드들을 비교할 것이다. 이분탐색은 한 리스트에 있는 데이터들의 탐색 범위를 점점 좁혀나가면서 구분하는 방식이다. 시작 노드 및 끝노드 인덱스를 더한 뒤 2로 나누어 중간 인덱스를 구하고, 그 값과 원하는 타겟값을 비교해서 targer > list[mid]인 경우 시작 노드값을 올리고, 반대인 경우는 끝 노드의 값을 올려가면서 찾는다. 이 이분 탐색은 반복문(while)을 사용한 방법과 재귀를 사용한 방법, 두 가지가 존재하는데 필자는 재귀를 좋아하기 때문에 재귀 방식을 사용하였다. #include #incl..
![[Unreal Engine C++] Timeline을 사용하여 암전 효과 만들기](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdq0l4C%2FbtsFmg4dKF2%2FWoUU3WJjOepI5HXtL15Cd1%2Fimg.png)
게임 프로젝트를 진행하면서 암전 효과가 필요했다. 특정한 버튼을 누르면 화면이 어두워졌다가 다시 밝아지면서 맵 또는 캐릭터가 변화하는 느낌을 주고 싶었다. 이를 언리얼에는 간단하게 시간 기반 애니메이션을 재생할 수 있도록 도와주는 타임라인이라는 시스템을 활용하여 암전 효과를 구현해보자. 에디터에서의 준비 일단 암전효과를 구현하기 위해 PostProcessVolume을 사용할 것이므로 레벨에 하나 놓아두고, 원하는 범위를 설정한다. PostProcessVolume의 Exposure의 노출 보정(Auto Exposure Bias)를 활성화시켜준다. 값은 숫자가 커질수록 화면이 밝아지고, 작아지면 어두워지기 때문에 타임라인을 사용해 값을 낮췄다가 다시 복구시킬 것이다. 또한 코드상에서 이 볼륨을 찾기 위해 M..