📝 3주차
- 언리얼 머터리얼 강의 [Unreal Engine 5: One Course Solution For Material] Section2🔗
- 백준 단계별로 풀어보기🔗
- 백준 공통 문제🔗
📅 7월 23일 21:00-24:00
📖 언리얼
‼ 언리얼 엔진5의 머터리얼 공부
1. 머터리얼 생성
- 우클릭으로 머터리얼 생성
- 생성된 머터리얼을 더블클릭하여 상세 창 확인
2. Data Type
Data Type | float | 단축키 |
---|
constant | 1float | 1 누르고 좌클릭 |
constant2Vector | 2floats (ex - X, Y) | 2 누르고 좌클릭 |
constant3Vector | 3floats (ex - R, G, B) | 3 누르고 좌클릭 |
- 아래와 같은 형태이며 화면의 우클릭으로도 constant 생성 가능
3. 머터리얼 적용 / 색상 변경
constant3Vector
를 생성하고 베이스컬러에 연결
- 좌측 디테일창의 상수로 색 조절
- 만든 머터리얼 적용
4. Roughness
- 0은 부드럽고, 1은 거칠다.
📖 백준
🪧 {공통} 18870 좌표압축
✔ 좌표압축
- 모든 구간이 아니라 중요한 구간이나 숫자만 들고있는 기법
- 값보다 값의 순위가 중요한 경우, 입력값의 개수 < 입력값의 범위일 때 사용
- ex)
-5
-1
0
2
2
-> 0
1
2
3
3
2
4
-10
4
-9
-> -10
-9
2
4
4
-> -10
-9
2
4
-> 2
3
0
3
1
- 원본 벡터와 정렬 벡터 두 개를 선언
- 정렬 벡터에서
erase(unique())
로 중복된 값 제거
find()
함수를 이용하여 원본 벡터의 원소가 정렬벡터에서 어디에 위치하는지 찾고 인덱스 출력 -> 시간초과
find()
함수대신 이진탐색 기반인 lower_bound()
함수를 이용하여 원본 벡터의 원소가 정렬벡터에서 어디에 위치하는지 찾음
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main(int argc, const char* argv[]) {
int N;
int temp;
vector<int> originVec;
vector<int> vec;
cin >> N;
for (int i = 0; i < N; i++) {
cin >> temp;
originVec.push_back(temp);
vec.push_back(temp);
}
sort(vec.begin(), vec.end());
vec.erase(unique(vec.begin(), vec.end()), vec.end());
for (int i = 0; i < N; i++) {
cout << lower_bound(vec.begin(), vec.end(), originVec[i]) - vec.begin() << " ";
}
return 0;
}
📌 벡터 중복 제거 erase(unique())
- 중복값을 제거하려면 정렬 과정이 반드시 필요하다. (인접한 원소들을 차례로 중복검사 하기 때문)
unique(x, y)
: x
~y
에서 연속된 중복 원소를 vector의 제일 뒷부분(쓰레기 값)으로 보냄
erase(x, y)
: 뒤에 붙은 쓰레기값 제거 (x
~y
범위 제거)
📌 하한 lower_bound(x, y, k)
x
~y
에서 찾는 값k
보다 같거나 큰 값을 반환하는 함수
- 이때 리턴값이 iterator이므로
.begin()
을 빼주면 인덱스를 구할 수 있음
#include <iostream>
using namespace std;
int gcd(int N, int M);
int lcm(int N, int M);
int main(int argc, const char* argv[]) {
int N, M;
int i, j, k = 0;
cin >> N >> M;
int* arr = new int[N]();
while (M != 0) {
M--;
cin >> i >> j >> k;
for (int n = i; n <= j; n++) {
arr[n-1] = k;
}
}
for (int i = 0; i < N; i++) {
cout << arr[i] << " ";
}
return 0;
}
📌 동적배열 선언 시 0으로 초기화
- 선언 시 맨 뒤에 () 또는 {}을 붙여 0으로 초기화
int* arr = new int[N]();
🪧 2775 부녀회장이 될테야
#include <iostream>
using namespace std;
int findNum(int k, int n) {
if (n == 1) return 1;
else if (k == 0) return n;
else return(findNum(k - 1, n) + findNum(k, n - 1));
}
int main(int argc, const char* argv[]) {
int T, k, n;
cin >> T;
int* arr = new int[T]();
for (int i = 0; i < T; i++) {
cin >> k;
cin >> n;
arr[i] = findNum(k, n);
}
for (int i = 0; i < T; i++) {
cout << arr[i] << endl;
}
return 0;
}
#include <iostream>
using namespace std;
int main(int argc, const char* argv[]) {
int N, M, a, b, temp;
cin >> N >> M;
int* arr = new int[N+1]();
for (int i = 1; i <= N; i++) {
arr[i] = i;
}
for (int i = 1; i <= M; i++) {
cin >> a >> b;
temp = arr[a];
arr[a] = arr[b];
arr[b] = temp;
}
for (int i = 1; i <= N; i++) {
cout << arr[i] << " ";
}
return 0;
}
🪧 5597 과제 안 내신 분..?
#include <iostream>
#include <algorithm>
using namespace std;
int main(int argc, const char* argv[]) {
bool arr[31] = {0, };
int temp;
for (int i = 0; i < 28; i++) {
cin >> temp;
arr[temp] = 1;
}
for (int i = 1; i <= 30; i++) {
if (!arr[i]) cout << i << endl;
}
return 0;
}