본문 바로가기

분류 전체보기252

[C#/Unity][디자인패턴] 디자인 패턴(Design Pattern) 알아보기 1. 디자인 패턴이란? - 설계자로 하여금 재사용이 가능한 설계를 선택하고, 재사용을 방해하는 설계를 배제하도록 도와줌 - 시스템의 유지보수나 문서화를 개선할 수 있고, 클래스의 명세도 정확하게 알 수 있으며, 객체 간의 상호작용 또는 설계의도까지 명확하게 정의할 수 있음. - 즉, "올바른" 설계를 "빨리" 만들 수 있도록 도와줌. - 같은 실수를 반복하지 않기 위해 특정 상황에서 발생하는 문제 패턴을 발견하고 해결방안을 기록한 것 - 효율적인 코드를 만들기 위한 방법론 2. 디자인 패턴의 종류 1) 생성 패턴 - 객체의 생성과 초기화를 다룸 - 객체를 만드는 방법에 대한 패턴 2) 구조 패턴 - 객체와 클래스를 조합해 더 큰 구조를 만드는 방법을 다룸 - 객체들의 구성이나 클래스들의 구성을 다루는 패.. 2023. 11. 7.
[프로그래머스][C++][0단계] 리스트 자르기 #include #include using namespace std; vector solution(int n, vector slicer, vector num_list) { vector answer; int a = slicer[0]; int b = slicer[1]; int c = slicer[2]; switch(n) { case 1: for(int i = 0; i 2023. 11. 7.
[Unity] 유니티 최적화(Unity Batching) 1. Draw Call(드로우 콜) - CPU : 디지털 콘텐츠를 구성하고 있는 게임 오브젝트, 데이터 등을 읽어들이는 역할 - GPU : CPU에게 받아온 데이터를 토대로해서 컨텐츠를 그리는 역할 - Draw Call : CPU가 GPU한테 자신이 읽어들인 데이터를 그리리고 내리는 명령 - Command Buffer : 드로우 콜에 따라오는 데이터들, 다양한 정보들의 버퍼들이 포함되어 있음. - SetPass Call : Command Buffer의 그래픽 계열 쪽(메테리얼, 쉐이더 등)을 묶어놓은 그룹 SetPass를 전달하는 것을 의미 - Batch : Draw Call + SetPass Call 을 통해 GPU로 넘기는 과정, 많으면 많을수록 부하가 줄음. - 최적화 : Batch를 줄이는 것. .. 2023. 11. 3.
[프로그래머스][C++][2단계] 이진 변환 반복하기 #include #include using namespace std; vector solution(string s) { vector answer; int num = 0; // 반복 횟수 int count = 0; // 제거된 0의 갯수 while(s != "1") { num++; // 모든 0 제거 string x; for(int i = 0; i 0) { bin += ((c % 2) + '0'); // 역순으로 저장됨 c /= 2; } // 역순 -> .. 2023. 11. 3.
[프로그래머스][C++][0단계] A 강조하기 #include #include using namespace std; string solution(string myString) { string answer = ""; for(int i = 0; i 'A' && myString[i] 2023. 11. 3.
[프로그래머스][C++][0단계] 왼쪽 오른쪽 #include #include using namespace std; vector solution(vector str_list) { vector answer; for(int i = 0; i < str_list.size(); i++) { if(str_list[i] == "l") { for(int j = 0; j < i; j++) { answer.push_back(str_list[j]); } break; } if(str_list[i] == "r") { for(int j = i + 1; j < str_list.size(); j++) { answer.push_back(str_list[j]); } break; } } return answer; } 1. 주어진 벡터 str_list를 첫 원소부터 반복하면서 "l" .. 2023. 11. 2.
[C#] 리플렉션(Reflection) 1. 리플렉션(reflection)이란? - 애플리케이션 실행 중 어셈블리의 내용(메서드, 프로퍼티, 생성자 등, 인스턴스의 데이터 타입 정보)을 확인하거나 검사하려는 경우 사용되는 기능 - 프로그램 실행 도중에 객체의 정보를 조사하거나, 다른 모듈에 선언된 인스턴스를 생성하거나, 기존 개체에서 형식을 가져오고 해당하는 메소드를 호출, 또는 해당 필드와 속성에 접근할 수 있는 기능을 제공한다. - 컴파일 시에 알 수 없었던 타입이나 멤버들을 찾아내고 사용할 수 있게 해주는 메커니즘 2. 리플렉션의 목적 - 애플리케이션 개발시, 디버깅 또는 런타임에 알 수 없는 객체의 동작을 분석하기 위함. - 외부 라이브러리에 존재하는 클래스 및 메서드를 분석하기 위함. - 개발 도구 자체를 개발하거나 분석도구를 만들때.. 2023. 11. 1.
[프로그래머스][C++][2단계] 올바른 괄호 #include #include using namespace std; bool solution(string s) { bool answer = true; int count = 0; for(int i = 0; i 0) answer = false; return answer; } 1. '('와 ')'의 갯수를 세서 같은 경우에만 올바른 것이므로 해당 경우를 찾아야한다. 2. 먼저 갯수를 셀 count 변수를 선언하고, 문자열 s를 반복하여 각 문자들을 탐색한다. 3. 문자가 '(' 인 경우는 count를 증.. 2023. 11. 1.
[프로그래머스][C++][0단계] 정수 부분 #include #include using namespace std; int solution(double flo) { int answer = flo / 1; return answer; } 1. 임의의 실수를 1로 나눴을 때 소수부분은 날아가고 정수부분만 남는 것을 이용하였다. 2. 주어진 실수 flo를 1로 나눈 몫을 answer에 저장한 뒤 리턴한다. 나눗셈의 몫을 이용하여 쉽게 풀었다. 2023. 11. 1.
[프로그래머스][C++] 최솟값 만들기 #include #include #include using namespace std; int solution(vector A, vector B) { int answer = 0; sort(A.begin(), A.end()); sort(B.rbegin(), B.rend()); for(int i = 0; i < A.size(); i++) { answer += A[i] * B[i]; } return answer; } 1. 두 배열의 원소들을 각각 곱해서 더한 값이 최소가 나오려면, 한 쪽의 가장 작은 값과 다른 한 쪽의 가장 큰 값을 곱하고, 그 다음 작은 값과, 다른 한 쪽의 그 다음 큰 값을 곱하고 이렇게 한 쪽은 작은 값부터 오름차순으로 다른 한 쪽은 큰 값부터 내림차순으로 쌍을 지어 곱해주어야 한다. 2.. 2023. 10. 31.
[개발 지식][C++/C#] 얕은 복사, 깊은 복사 1. 얕은 복사(shallow copy) - 한 객체의 모든 멤버 변수의 값을 다른 객체로 복사 - 실제 포인터가 가리키는 값은 같기 때문에 한 쪽이 변하면 다른 한 쪽도 따라서 변함 2. 깊은 복사(deep copy) - 한 객체의 모든 멤버 변수의 값 뿐만 아니라, 포인터 변수가 가리키는 모든 객체에 대해서도 복사 - 포인터까지 복사가 되어 생기는 것으로, 한 쪽이 아무리 바뀌어도 다른 한 쪽에는 영향이 없음 3. 소스코드(C++) // c++ #include #include #include #define _CRT_SECURE_NO_WARNINGS using namespace std; class Student { public: char* name; int age; Student(const char* .. 2023. 10. 31.
[프로그래머스][C++] JadenCase 문자열 만들기 #include #include using namespace std; string solution(string s) { for(int i = 0; i = 'a' && s[i] 대문자로 변경 s[i] = s[i] - 'a' + 'A'; continue; } if((s[i] == ' ') && (s[i + 1] >= 'a' && s[i + 1] 대문자로 변경 s[i+1] = s[i+1] - 'a' + 'A'; continue; } if(i != 0 && s[i - 1] != ' ' && s[i] >= 'A' && s[i] 소문자로 변경 s[i] = s[i] - 'A' + 'a'; } } return s; } 1. 입력받은 문자열 s의 각 .. 2023. 10. 31.