[2023 하계 모각소] 어만사 5주차

jungizz_·2023년 7월 31일
0

모각소

목록 보기
5/12
post-thumbnail

📝 5주차

  • 언리얼 머터리얼 강의 [Unreal Engine 5: One Course Solution For Material] Section2🔗
  • 백준 단계별로 풀어보기🔗

📅 8월 6일 21:00-24:00



📖 언리얼

12. Opacity

  • Opacity를 조절하기 위해서는 Material의 result node의 Blend Mode를 Translucent로 바꿔줘야한다.
  • 현재 화살표 텍스처의 R채널에는 화살표 영역만 1이고 나머지는 0이므로, R채널을 Opacity에 연결하면 뒤의 배경이 사라진다.

13. 움직이는 텍스처

  • 텍스처를 움직이기 위해서는 UV를 조절
  • 텍스처가 오른쪽으로 움직이려면 U를 감소, 위로 가려면 V를 증가 (텍스처는 가만히 있고 액자만 움직인다 생각하기)
  • 거리 = 속력 * 시간이므로 속도 상수Time을 곱해 시간에 따른 거리를 구한다.
  • TexCoord거리를 더하여 텍스처 UV에 적용하면 텍스처가 움직인다.
  • 오른쪽을 향하는 화살표 방향대로 움직이기 위해서 U만 조절해야한다.
  • UV를 Component Mask로 분리해서 U만 감소시키고, V는 그대로 둔 뒤 Append Vector로 합쳐준다.

➕ Panner

  • 더 쉽게 텍스처를 움직이는 방법
  • Panner은 2벡터를 반환하는 형태로 UV채널에 넣을 수 있다.
  • 위에서 했던 연산을 포함하는 노드로 Speed만 조절하면 움직이게 할 수 있다.
  • 아래처럼 Time노드와 함께 사용할 수도 있다.

14. Material Instance

  • 머터리얼 창 안이 아니더라도 속성을 수정할 수 있도록 하는 기능
  • 원하는 머터리얼을 우클릭하여 Material Instance를 생성하고, 액터의 머터리얼을 기존 M_MovingArrow에서 MI_MovingArrow로 바꾼다.
  • 원하는 속성을 우클릭하여 Convert to Parameter를 누르고 이름을 정한다.
  • 그러면 Material Instance창에 Parameter가 생긴다. 이름이 있어 가독성이 좋고 간단하게 속성을 조절할 수 있다.
  • Material Instance의 parameter를 만들기 위해서는 single float가 필요하다.
  • 원하는 속성이 Detail창 안의 여러 속성 중 하나라면 single flaot 노드로 뽑아내야한다.
  • S+좌클릭하면 Parameter로 적용할 원벡터 노드가 바로 생긴다.
  • 해당 노드의 디테일 창에서 기본값과 슬라이더를 조절할 수 있다.

15. Writting Comments

  • 원하는 노드를 선택하고 C를 누르면 주석 박스가 생긴다.
  • 디테일 창에서 색상과 폰트 크기를 조절할 수 있으니.. 이런 식으로 사용하면 된다

16. Fire material

  • 수평으로 움직이는 텍스처와 수직으로 움직이는 텍스처를 곱한 뒤, 전체적인 밝기를 높이기 위해 상수를 곱해 Base Color와 Emission Color에 적용
  • 더 보완하기 위해 텍스처의 타일링을 조절히고, single float로 뽑아내기 위해 아래와 같이 수정할 수 있다.



📖 백준

🪧 2941 크로아티아 알파벳

  • 문자열 맨 앞에 크로아티아 알파벳이 있다면 해당 알파벳을 문자열에서 삭제하고 단어 개수를 카운트
  • 맨 앞에 일반 알파벳이라면 해당 알파벳(1글자)만 삭제하고 단어 개수 카운트
  • 문자열의 길이가 0이 될 때까지 반복한다.
#include <iostream>
#include <string>
using namespace std;


int main(int argc, const char* argv[]) {

	string apb[8] = { "c=", "c-", "dz=", "d-", "lj", "nj", "s=", "z=" };
	string word;

	int cnt = 0;

	cin >> word;

	//word 문자열 길이가 0이 될때까지
 	while (word.length() != 0) {

		//크로아티아 알파벳 순회
		for (int i = 0; i < 8; i++) {

			//word 맨 앞에 크로아티아 알파벳이 있다면
			if (word.find(apb[i]) == 0) {

				//크로아티아 알파벳이 dz=인 경우만 맨 앞에서 3글자를 지우고, 나머지는 2글자를 지운다.
				if (apb[i] == "dz=") word.erase(0, 3);
				else word.erase(0, 2);

				//단어 개수 카운트
				cnt++;

				//for문 나옴
				break;
			}

			//word 맨 앞이 크로아티아 알파벳이 아닌 경우
			if (i == 7) {

				//한글자만 지우고 단어 개수 카운트
				word.erase(0, 1);
				cnt++;
			}
		}
	}
	cout << cnt;
}

❕ 다른 사람의 풀이

  • 알파벳을 찾으면 삭제하지 않고, replace()함수로 #과 같은 문자로 바꾼 뒤 문자열 길이를 출력함.
for(int i = 0; i < 8; i++)
{
    while(1){
        idx = word.find(apb[i]);
        if(idx == string::npos) break; //크로아티아 알파벳을 못찾은 경우
        word.replace(idx,apb[i].length(),"#"); //찾은 경우 크로아티아 알파벳 길이만큼을 #으로 교체
    }
}
cout << word.length();
💭 나는 굉장히 비효율적으로 풀고있었구나.. ... .

📌 단어 유무 찾기 find()

  • string::find(): 문자열 앞에서부터 검색하며 검색 문자열이 시작되는 위치를 반환
  • 검색 문자열을 찾지 못한 경우 string::npos를 반환한다.
if(str.find(검색 문자열) == string::npos) //검색 문자열을 찾지 못한 경우

🪧 1316 그룹 단어 체커

  • 그룹 단어가 아닐 조건은 특정 문자가 직전 문자와 같지 않을 때, 직전 문자를 제외한 이전에 특정 문자와 같은 문자가 존재하는 것이다.
  • 이 경우에만 False를 반환하고, 아닌 경우에는 True를 반환한다.
#include <iostream>
#include <string>
using namespace std;


bool isGroup(string s) {

	for (int i = 2; i < s.length(); i++) { //첫번째, 두번째 문자는 확인할 필요X
		if (s[i] != s[i - 1]) { //특정 문자가 직전 문자와 같지 않고
			for (int j = 0; j < i-1; j++) {
				//직전 문자를 제외한 이전에 존재하면 그룹 단어가 아님
				if (s[i] == s[j]) return false;
			}
		}		
	}
	return true;
}

int main(int argc, const char* argv[]) {
	
	int n, cnt = 0;
	string s;

	cin >> n;

	for (int i = 0; i < n; i++) {
		cin >> s;
		if (isGroup(s)) cnt++;
	}

	cout << cnt;

	return 0;
}

🪧 25206 너의 평점은

#include <iostream>
#include <string>
using namespace std;


int main(int argc, const char* argv[]) {
	
	string name, grade;
	float credit;

	float scoreSum = 0;
	float subjectSum = 0;

	for (int i = 0; i < 20; i++) {
		cin >> name >> credit >> grade;
		if (grade != "P") {
			subjectSum += credit;
			if (grade == "A+") scoreSum += credit * 4.5;
			else if (grade == "A0") scoreSum += credit * 4.0;
			else if (grade == "B+") scoreSum += credit * 3.5;
			else if (grade == "B0") scoreSum += credit * 3.0;
			else if (grade == "C+") scoreSum += credit * 2.5;
			else if (grade == "C0") scoreSum += credit * 2.0;
			else if (grade == "D+") scoreSum += credit * 1.5;
			else if (grade == "D0") scoreSum += credit * 1.0;
		}
	}

	cout << scoreSum / subjectSum;

	return 0;
 }

🪧 25083 새싹

  • c++에서 특수문자(", \) 출력하기 위해서는 \를 앞에 붙여야함
#include <iostream>
#include <string>
using namespace std;


int main(int argc, const char* argv[]) {

	cout << "         ,r'\"7" << endl;
	cout << "r`-_   ,'  ,/" << endl;
	cout << " \\. \". L_r'" << endl;
	cout << "   `~\\/" << endl;
	cout << "      |" << endl;
	cout << "      |" << endl;

	return 0;
 }
profile
( •̀ .̫ •́ )✧

0개의 댓글