코딩테스트
[level 1] 숫자 짝꿍 - 131128
https://school.programmers.co.kr/learn/courses/30/lessons/131128
[level 1] 숫자 짝꿍 - 131128 풀이코드
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
vector<int> a, b;
string solution(string X, string Y) {
for (char i : X) a.push_back(int(i));
for (char i : Y) b.push_back(int(i));
sort(a.begin(), a.end());
sort(b.begin(), b.end());
vector<int> buff(a.size() + b.size());
// 교집합을 구하는 메서드
auto iter = set_intersection(a.begin(), a.end(), b.begin(), b.end(), buff.begin());
buff.erase(iter, buff.end());
sort(buff.begin(), buff.end(), greater<int>());
string answer = "";
for (int i : buff) answer += i;
// 값이 없으면 -1을 리턴
if (answer == "") answer = "-1";
// 값의 첫번째 - 가장 큰 수가 0이면 0으로 => 00 = "0";
if (answer[0] == '0') answer = "0";
return answer;
}
[Silver III] 패션왕 신해빈 - 9375
https://www.acmicpc.net/problem/9375
[Silver III] 패션왕 신해빈 - 9375 풀이코드
// 모든 경우를 구하고 아무것도 안입는 경우인 1을 뺀다.
// head 2 => 3
// body 1 => 2
// 3 * 2 = 6 - 1 = 5 -> 이게 답
#include <bits/stdc++.h>
using namespace std;
int a, b;
string input;
vector<int> aVc;
int main()
{
ios::sync_with_stdio(false); cin.tie(NULL);
//cin >> a;
cin >> a;
for (int i = 0; i < a; i++) {
cin >> b;
map<string, int> aMap;
for (int i = 0; i < b; i++)
{
string word;
cin.ignore();
getline(cin, input);
// 한 줄을 받아서 공백(' ')을 기준으로 앞에 내용 제거 후 뒤에 단어 받아옴
// 강사님은 cin >> a >> b에서 b를 받아서 처리...
for(int j = 0; j < input.length(); j++)
{
if (input[j] == ' ')
{
word = "";
}
else word += input[j];
}
aMap[word]++;
}
int answer = 0;
answer = 1;
for (auto i : aMap)
{
answer *= i.second + 1;
}
answer--;
aVc.push_back(answer);
}
for (int i : aVc) cout << i << '\n';
return 0;
}
문제에서 경우의 수를 구하는 문제이면 리턴 값을 long long 형으로 진행하자
수가 커지는 경우가 많다.
8시 30분에 시작해서 45분만에 하나 더 풀었다.
[Silver III] 팰린드롬 만들기 - 1213
https://www.acmicpc.net/problem/1213
[Silver III] 팰린드롬 만들기 - 1213 풀이코드
#include <bits/stdc++.h>
using namespace std;
string a, r, l;
int b;
int names[50];
int main() {
ios::sync_with_stdio(false); cin.tie(NULL);
cin >> a;
sort(a.begin(), a.end());
for(int i = 0; i < a.length(); i++) {
if (names[a[i] - 'A'] > 0) {
r += a[i];
names[a[i] - 'A']--;
}
else names[a[i] - 'A']++;
}
l = r;
reverse(l.begin(), l.end());
for (int i = 0; i < 50; i++) {
if (b > 1) {
cout << "I'm Sorry Hansoo";
exit(0);
}
if (names[i] > 0) {
r += (i + 'A');
b++;
}
}
cout << r + l << endl;
return 0;
}
솔루션 구조
Engine (중요)
언리얼엔진의 자체 소스코드 → 언리얼엔진의 Core
Games (중요)
만들게 되는 프로젝트의 설정 및 로직 코드
- Config → 게임을 제작하는 과정 속 여러 가지 설정이 모여있음
- Source → 프로젝트를 동작하는 로직을 작성하는 실질적인 위치
Programs
서버모듈, 라이브러리 등 많은 툴 코드가 모여있다.
Rules
빌드 규칙을 담아둔 폴더
Visualizers
디버깅시 언리얼의 자료구조를 편하게 하기 위해 존재
빌드 모드
Editor → 에디터 상으로 빌드가 진행 → 언리얼 에디터에서 플레이 가능
기본 → exe로 빌드
DebugGame, DebugGame Editor
- 디버깅을 하기에 최적화된 모드
Development, Development Editor
- 디버그 정보가 축소되고 빌드가 조금 더 빠르기 때문에 일반적인 테스트 상황에 적합
Shipping
- 배포 단계 ( 릴리즈 단계 ) → 디버그 정보가 다 빠지고 빌드가 된다.
Ctrl + Shift + B ⇒ Build Solution
- 전체 빌드이기 때문에 내가 수정한 부분만 빌드하기 위해서는 부분 빌드 사용
- 내가 제작한 프로젝트의 우클릭을 선택해서 Build 하면 된다.
다양하게 시도했는데 빌드가 실패한다면?
- 언리얼 에디터 종료
- Visual Studio 2022 종료
- 프로젝트 경로로 이동 후 Saved, Intermidiate, DerivedDataCache 폴더 제거
- . uproject 파일 우클릭 후 Generate Visual Studio project files 클릭
- 실행하면 왠만하면 성공
- 해결이 되지 않는다면 솔루션 → Build ⇒ Clean Build
- 솔루션 → Build ⇒ Solution Build
소스코드 분석
#pragma once → 같은 헤더파일 중복 컴파일을 막아주는 코드
#include “CoreMinimal.h” → 언리얼 엔진의 기본 타입, 함수를 다 포함하는 헤더 파일
#include “GameFramework/Actor.h” → 엑터 클래스의 정보를 가지고 있는 헤더 파일
#include “Item.generated.h”
- 언리얼 리플렉션 시스템을 위해서 포함되는 헤더 파일
- 중요* 모든 헤더파일 중에 가장 마지막에 인클루드 돼야 한다.
UCLASS() → 블루프린트에서 접근 가능하도록 설정
- Blueprintable → 블루프린트에서 상속 가능
- NotBlueprintable → 블루프린트 상속 불가능
- BlueprintType → 해당 클래스를 블루프린트 변수로 사용 가능
GENERATED_BODY() → 클래스 내에서 사용한 코드들을 리플렉션 시스템에 등록하기 위한 메서드
UPROPERTY()
- VisiableAnywhere → 디펄트 클래스와 인스턴스 둘 다 수정 불가능
- EditAnywhere → 디펄트 클래스와 인스턴스 모두 수정 가능
- EditDefaultsOnly → 디펄트 클래스는 수정 가능, 인스턴스는 수정 불가능
- EditInstanceOnly → 디펄트 클래스는 수정 불가능, 인스턴스는 수정 가능
UFUNCTION()
- BlueprintCallable
- BlueprintPure
- BlueprintImplementableEvent
로그 카테고리 선언
헤더파일
DECLARE_LOG_CATEGORY_EXTERN(LogSparta, Warning, All);
LogSparta라는 로그 카테고리를 선언한다 (기본값은 Warning이지만 상황에 따라서 다 사용 가능)
CPP파일
- 선언 → DEFINE_LOG_CATEGORY(LogSparta);
- 사용 → UE_LOG(LogSparta, Error, TEXT("My Sparta!"));
언리얼 생명주기(Life Cycle)
생성하는 상황
- 생성자 → 메모리에 생성 후 딱 한 번 호출된다.
- PostInitializeComponents() → 컴포넌트가 완성된 직후 호출, 컴포넌트끼리 데이터 주고받기, 상호작용
- BeginPlay() → 배치(Spawn) 직후 호출
- Tick(float DeltaTime) - 매 프레임마다 호출, 성능 영향이 크므로 사용 시 주의
- Destroyed() - 오브젝트가 삭제가 되기 직전에 호출, 리소스 정리 등
- EndPlay() - 게임 종료, 파괴(Destroyed()), 레벨 전환
Destroyed() → EndPlay()
EndPlay() → 그냥 끝.