물체의 노말벡터를 이용해서 stylized rendering를 사용했다.
C언어에서 함수를 호출하고 변수를 쓰는 것이 MOV, PUSH, CALL 등으로 내부적으로 쪼개져서 작동한다.
행렬 계산, 라이팅, 그림자 처리, 퐁세이딩, 비트맵 등
컴퓨터 구조에서 여러 레지스터가 있고 하나씩 명령어가 실행되고 어떻게 실행중인 프로그램의 변수를 저장하는지
컴파일타임 런타임 런타임에서 메모리 할당하게 하기
바이트 단위로 주소가 지정된다.
int ptr == (int ) malloc(sizeof(int)); : malloc은 void리턴해서 int *로 캐스팅
int (add_ptr)(int, int) = &add; // add 함수를 add_ptr함수 포인터에 연결
디자인 패턴 component가 유니티에서 컴포넌트이다.
프로그램이 메모리에 올라가 있는 상태가 프로세스이다.
한글이 윈도우-맥사용하면서 깨지는 이유?
하나의 코어에서 프로세스를 하나 돌리는지 스레드를 하나 돌릴 수 있는지
-> 스레드 하나이다.
변수가 어떻게 메모리의 주소와 연결?
-> 함수가 호출되면 변수가 스택에 저장된다
함수 포인터?
-> 함수의 주소값을 저장한다. 함수 반환하는 함수, 함수 매개변수로 받기 가능하다. 함수 동적으로 생성, 실행
함수 포인터랑 함수객체 차이?
함수 객체?
-> 클래스나 구조체의 객체로서, 함수 호출 연산자 ()를 오버로딩하여 함수처럼 동작하게 만들어진 객체
cout이 객체?
리틀 엔디언 : 타입읽기, 형변환 빠름, 수학적 연산 쉬움
빅 엔디언 : 사람이 보기 편함, 네트워크 바이트 오더에서 사용
메모리에서 동적할당을 할 때 왜 힙 구조를 이용해서 저장하지?
Array
데이터를 순서대로 옆칸에 하나씩 넣는다
LinkedList
시작 지점이 있고 순서대로 다음 데이터가 어디있는지 정보를 갖고있다
Stack
FILO 책쌓기
Queue
FILO 대기줄
Tree
루트가 있고 연결된 구조
레벨있고 사이클 없는 그래프
BinaryTree
Lchild Rchild 로 연결된 트리구조
높이 logN
Big O
인풋에 따라 시간이 얼마나 걸리는지 측정
1 logN N NlogN N^2 N! N^N
DFS
뎁스 늘려가면서 쭉 스택으로 넣고 체크하기
BFS
각 뎁스의 것들을 큐에다가 넣고 체크하기
Recursion
함수안에서 그 함수를 불러서 처리하기
DivCon 이고 종료조건 있다
BruteForce
그냥 다 실행해보기
Dynamicprogramming
전에 저장해둔 값을 이용해 현재 값 구하기
DivideandConqure
문제를 나눠서 풀고 합치기
Greedy
전체를 보지않고 현재 상태만으로 최선의 판단하기
Deadlock
잠겨있는데 풀지 못한다 원인은 두개가 각각 다른 쪽으 값으로 실행되기때문에 기다리는중
BST
BT에서 찾는방법 작은값 왼쪽 큰값 오른쪽
데이터 넣을때 값 비교하면서 교체
구현 못함
BinaryHeap
맨위 큰값 유지
가장 끝 리프에 넣고 값 교체
구현못함
HashTable
해쉬된 것들을 키에 맞게 저장 골고루 잘 넣기
속도 빠름
구현 못함
Backtracking
DFS 전 상태 되돌아가서 처리..?
DP랑 뭐가 다른지 헷갈림
UnionFind
그래프에서 같은 그룹인지 판단
루트에다가 연결해놓기 풀어봤는데 기억안남
상세구현 모름
LongestCommonSubstring
가장긴공통문자열 길이찾기
DP로 풀어본 적있다
QuickSort
피벗잡고 왼쪽 오른쪽 나눈다 재귀적으로 계속잡기
구현 못함
MergeSort
전체를 사이즈1이 될때까지 나눈다
두 배열 앞에서부터 비교하면서 하나로 계속 합친다
구현 못함
Graph
Node 들이 Edge들로 연결된 상태
링크드리스트 2차원배열로 풀어는 봤는데 잘 못쓴다
RedBlackTree
빨강 검정으로 마크해두면서 트리의 불균형을 잡는다
개념 작동방식 구현 모른다
A*
휴리스틱으로 위에서 빠른길 찾는다는데 전혀 모른다
개념 작동방식 구현 모른다
MST
가장작은신장트리 그래프 트리로 만들때 가장 빠른길
다익스트라 플로이드워셜로 만든다
구현못함
Dijkstra
각 점에서 다른 점으로 최소거리 업데이트
작동방식 구현 모른다
BellmanFord
개념 작동방식 구현 모른다
Trie
이진을 삼진으로 바꾼 것
개념 작동방식 구현 모른다
Mutex
락을 잡아서 다른 스레드가 못쓰게한다
개념 작동방식 구현 모른다
Semaphore
뮤텍스랑 차이 모른다
개념 작동방식 구현 모른다
NetworkFlow
그 선에 한계점이 있을때 최대로 보내는 방법
개념 작동방식 구현 모른다
큰수연산
자료형 이상으로 넘어갈때 문자열로 만들어서 올림 처리한다
더하기는 해봤는데 빼기 곱하기 나누기 못한다
ReadersWritersProblem
읽는건 열어두고 쓰는건 한명만하기
개념 작동방식 구현 모른다
BitMask
유니티레이어 쓸때 써봤는데 전혀 모르겠다
숫자를 비트연산해서 빠르게 계산한다
개념 작동방식 구현 모른다
→ 충돌 감지를 하는 원과 비교 대상이 되는 원들 간의 거리를 계산하여 미리 일정 범위 내에 있는 원들을 선택하고, 이들만 충돌 감지를 진행하도록 구현
→ 비용 작은 엣지 순서로 추가해서 사이클 없게 MST만들기
50자리 부동소수점
박스 minPoint, maxPoint를 잡아서 다른 박스의 min, max 포인트와 비교해서 교차하는지 체크
if (a.maxX < b.minX || a.minX > b.maxX) return false;
double보다 수학계산 할 때 정확하게 쓸 수 있다.
해시함수 O(1), 해시값으로 idx 사용 O(1)
x가 0인 곳만 예외처리하기, long double 형으로 더 정확하게 쓰기
그리드나 트리 구조로 공간을 분할해서 연산량을 줄인다. 쿼드트리로 2D를 4분할해서 재귀적으로 관리한다.
수를 1차원 벡터화 했다. 허수는 숫자를 2차원 벡터화 한 것이다.
ratio + nal 정수의 비율로 나타낼 수 있는 수 비율적인 수
정수의 비율로 나타낼 수 없는 수 PI, e, 루트2
유리수 + 무리수
제곱해서 음수 되는 수
실수부 + 허수부 복소평면에서 i를 곱할 때마다 반시계방향으로 회전한다.
그렇게 쓰기로 약속, 이미 써와서 편함
경우에 대한 선택지를 정해 놓음
위치를 표현하는데 필요한 숫자의 개수
GPU에서 코딩할 수 있도록 하는 도구
동시에 변수 처리하는 것이 막혀있다. 제조사에서 잘 만들어놓았다.
연산 했는데 결과 바뀌지 않는 것
연산을 했을 때 항등원이 나오는 것 3, 1/3
text-image model 확산을 안정적으로 시뮬레이션한다.
다변수함수에서 한 개의 변수에 대해서만 미분하는 것
매개변수를 업데이트하면서 값을 구한다. 편미분을 계산해서 어떤 방향으로 갈지 찾는다.
운영체제에서는 HW-SW 인터페이스
GPU에서는 병렬처리 함수 벡터 덧셈, 행렬 곱셈 동시에 처리한다
General-Purpose Graphics Processing Unit
CPU 독립된 메모리 공간을 가진 프로세스들이 별도로 실행되면서 동시에 작업을 수행
GPU 하나의 프로세스 내에서 여러 개의 스레드가 동시에 실행되면서 작업을 수행하는 모델
프로세스 간의 상호작용
파이프(Pipe) 소켓(Socket) 메시지큐(Message Queue) 공유 메모리(Shared Memory)
GPU에서 실행되는 병렬 코드를 작성할 수 있다
<<를 오버라이딩해서 출력하도록 한다.
CPU + IO + RAM + SDD + GPU
CPU가 프로그램을 메모리에 올려서 실행되게 한다
메모리에서는 코드 데이터 힙 스택 영역이 있다.
엘런튜링 : FSM
폰 노이만 : CPU-Memory-IO 버스를 이용한 데이터 교환 모델
SW가 HW위에서 돌아갈 수 있도록 한다
CPU가 언제 어떤 프로세스를 실행할지 스케쥴링한다
프로세스간에 통신할 수 있도록 한다.
CPU는 메인메모리에 데이터를 요청한다
CPU 안 메모리 = 레지스터에 명령어와 변수를 쌓아놓고 ALU에서 계산한다
2진수 :
16진수 : 0x1 ~ 0xF
Bit : 0, 1
Byte : 8Bit
KByte : 1024Byte
MByte : 1KB * 1024
GByte : 1MB * 1024
1000 씩 곱해진다
리틀 엔디안 : 뒤에서부터 읽기
빅 엔디안 : 앞에서부터 읽기 네트워크 표준
signed type에서 가장 앞 비트가 1이면 음수이다
부동소수점 : IEEE 숫자 표시
float : 소수점 아래 1/2, 1/4로 표시
double : 표현할 수 있는 범위 8byte
‘a’
아스키코드 : 키보드에 있는 문자
유니코드 : OTF-8 OTF-16
char a[10];
뒤에 \0 == null을 붙힌다.
\ : 여러가지 출력할 때 쓰는 표현
\n : 다음 줄로 바꿔서 출력한다
내장형 프로그램 방식
명령어와 데이터를 동등하게 기억장치에 저장
프로세스 간에 데이터를 공유할 때 포트를 통해 한다
각각 PC의 포트를 담당하는 소켓은 각각 하나의 프로세스이다.
Big : 0x12, 0x34, 0x56, 0x78
Little : 0x78, 0x56, 0x34, 0x12
양수 비트 반전해서 +1 해서 음수를 표현한다.
아스키코드 : 0~127 + ParityBit
유니코드 : UTF-8 일반적 사용(빅엔디안) UTF-16 MS Window 커널 내부 인코딩(리틀엔디안)
stdio 표준 입출력 스트림
\ : 여러가지 출력할 때 쓰는 표현
인코딩 : 문자 → 이진수 숫자
문자열 상수 : 이름 x, 문자열 내용 변경 불가
CPU + Memory + IO + Bus + Secondary Storage
문자 하나를 숫자 하나에 대응시킨다
HW와 응용 프로그램 사이의 인터페이스 역할을 담당하는 시스템 소프트웨어
커널 + 서비스 프로그램
입력을 받아서 처리를 해서 출력한다.
ALU + Control Unit + Registers
CPU와 직접 데이터 교환을 할 수 있다
0b1010
부호 + 지수부 + 가수부
float : 4byte
double : 8byte
Automatic Storage : Stack
Dynamic Storage : Heap
Static Storage : Data
Thread-Local Storage : 각 스레드가 자신만의 스택 메모리 공간을 가진다.
문자열을 쓸 때는 맨 뒤에 \0이 있도록 약속되어있다.
클래스 안 private 값을 처리할 수 있도록 한다.
get, set으로 어떻게 할지 커스텀 할 수 있다.
Stream을 상속해서 버퍼에 여러개를 모아서 큰 단위 입출력을 효율적으로 한다
파일 및 네트워크에서 대용량 데이터를 읽거나 쓸 때 IO성능을 향상시킨다
리소스 삭제 생성 횟수를 줄이기 위해서 미리 풀에다가 넣어놓고 필요할 때 쓴다
사용하지 않는 객체를 자동으로 탐지해서 해제한다
함수가 아니라 연산자이다
레어어설정
간격 조정 : 불완전해질 수 있음
영역 제한
최적화 알고리즘 : AABB
포인터를 감싸는 클래스
unique_ptr : 한 객체에 대해서 하나만 생성한다
shared_ptr : 참조 횟수를 계산한
weak_ptr : 참조를 유지하지 않고 객체를 관찰해서 shared_ptr사라지면 삭제한다
연산자를 정의해서 쓸 수 있다
여러 클래스가 동일한 메소드 이름을 가질 수 있다
상속, 가상함수를 통해 구현된다
객체가 어떤 타입인지에 따라 실행되는 메소드가 결정된다
L : 주소가 있는 변수
R : 임시 변수
nullptr_t 타입
포인터의 값이 없다 → 오버로딩한 함수 호출 명확히 구분
연산자 오버로딩으로 원하는대로 정의할 수 있다
생성자 : 메모리 할당
소멸자 : 메모리 자동으로 해제
스택, 힙, 실행 코드 영역이 분리되지 않고 메모리의 일정한 위치에 할당되어있다.
할당 해제 반복하면서 작은 조각으로 나누어져서 사용하지 못하게 된다
문자열 리터럴이 메모리에 상수로 저장된다
포인터를 수정할 수 없도록 const로 보호한다
abstract : 해당 method의 기본 구현을 제공하지 않고, 하위 클래스에서 무조건 method를 구현한다
virtual : 해당 method의 기본 구현을 제공하면서, 하위 클래스에서 필요에 따라 해당 method를 override 한다
객체로 만들 수 없고 상속으로 하위 클래스에서 구현한다
클래스 선언에서 사용할 수 없다
async() : .함수를 비동기적으로 실행하는데 사용된다
future : 비동기 함수의 반환값을 받을 때 사용된다
promise() : 비동기 함수에서 예외를 던질 때 사용된다
비동기 함수는 반환값으로 Promise객체를 반환한다
#include <string>
#include <iostream>
using namespace std;
using ll = long long;
/*
숫자 + cnt
10 넘어가면 처리?
배열에 저장? 아니면 매번 새롭게 제작?
*/
string getAnt(string str) {
string ret = "";
int tmpNum = str[0] - '0';
int cnt = 1;
for (int i = 1; i < str.size(); i++) {
if (str[i] - '0' != tmpNum) {
ret = ret + char(cnt + '0') + char(tmpNum + '0');
tmpNum = str[i] - '0';
cnt = 1;
}
else {
cnt++;
}
}
ret = ret + char(cnt + '0') + char(tmpNum + '0');
return ret;
}
int main() {
ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
int N; cin >> N;
string answer = "11";
if (N == 1) answer = "1";
if (N == 2) answer = "11";
for (int i = 3; i <= N; i++) {
answer = getAnt(answer);
//cout << answer << "\n";
}
cout << answer;
return 0;
}
객체의 정보를 런타임 중에 가져와 분석할 수 있다
게임엔진 만들 때 인스펙터를 만들기 위해서 사용한다
코테 통과 수준 : 문제 하루에 한 개씩 풀기
opengl : 과제 정리하기, 시험 다시 풀기, 설명 써 놓기
수학 : 알아야 할 키워드 정리해놓기 강의노트 보고 체크하기
javidx9 강의 쭉 듣기 → 클론코딩하기
rookiss 강의 쭉 듣기 → 클론코딩하기
면접 준비하기 : 기출 정리하기
인터프리터 언어를 cpp로 바꿔준다 C#의 성능을 올려준다
cast : (int)
comma : func(a, b)
scope resolution : std::
pointer to member : obj.member, objPtr→member
typeid : 객체 타입
obj.member : 객체 내 변수, 함수에 접근한다
objPtr→member : 객체의 포인터로 변수, 함수에 접근한다
typeid는 타입 정보만 제공한다
객체 내부구조, 속성정보 확인 → 객체 상태분석, 직렬화
클래스, 메서드 이름 → 런타임에 클래스, 메서드 동적으로 호출
상속, 다형성 지원
같은 연산자를 데이터 타입에 따라 다르게 동작하도록 설정한다
함수 호출이 아니라 operator를 이용한다
다양한 인자 형태에 대응하기 위해 여러 정의를 만든다
// int result = ++i;
mov eax,dword ptr [i]
inc eax
mov dword ptr [i],eax
mov eax,dword ptr [i]
mov dword ptr [result],eax
// int result_j = j++;
mov eax,dword ptr [j]
mov dword ptr [result_j],eax
mov eax,dword ptr [j]
inc eax
mov dword ptr [j],eax
Human error를 줄이려면 ++i를 사용해야한다
역수 : 분모와 분자 바꾸었다
역함수 : 입력값와 출력값의 순서를 바꾸었다
DX에서는 왼손 좌표계를 사용한다
포인터에 더하면 자료형의 크기만큼 더해진다
입력 → 정점 셰이더 → 기하 셰이더 → 픽셀 셰이더 → 출력
int* 저장하는 10칸 배열 만든다
#include <string>
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
using ll = long long;
int main() {
ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
//1. 배열을 선언하고, 문자 'A', 'B', 'C' 를 담아보세요.
char q1[] = {'A', 'B', 'C' };
//2. 아래 코드의 출력값은?
{
int aList[5] = { 10, 20, 30, 40, 50 };
aList[0] = 100;
aList[1] = aList[0];
aList[2] += aList[1];
cout << aList[2] << endl;
// 130
}
//3. 아래 코드의 출력값은?
{
int arr2d[2][3] = {
{1, 2, 3},
{4, 5, 6}
};
cout << arr2d[1][1] << endl;
// 5
}
//4. 각 배열의 바이트수를 출력한 결과는 얼마인가?
{
char arr1[] = { '1','2','3','4','5' };
char arr2[] = "12345";
cout << sizeof(arr1) << endl;
cout << sizeof(arr2) << endl;
// 5, 6
}
//5. 배열을 선언하고 1부터 10까지 숫자로 초기화해 보세요. ( for 문 )
int q5[10] = {};
for(int i = 1; i <= 10; i++)
q5[i] = i;
//6. 아래 char 배열의 갯수를 출력하는 코드 작성하세요.
{
char array[] = "Hello World";
cout << sizeof(array) / sizeof(array[0]) << endl;
}
//7. 5번의 플레이 결과 다음과 같은 점수가 발생했습니다. 평균 점수를 구하세요. (소숫점 2자리)
// 65 75 50 80 99
double sum = 0;
int q7[] = { 65, 75, 50, 80, 99 };
for(int i = 0; i < 5; i++)
sum += q7[i];
printf("%.2lf", sum / 5.0);
//8. 아래 배열에서 가장 큰 숫자를 찾아 출력하는 코드를 작성하세요.
{
int arraynumber[] = { 1, 8, 13, 24, 7, 17, 3 };
}
//9. 정수 5개를 배열로 선언하여 입력을 받고, 입력받은 수 중에 짝수만 출력하는 코드를 작성하시오
{
int array[5];
}
//10. 문자 5개를 배열로 선언하여 입력을 받고, 입력받은 소문자를 대문자로 출력하는 코드를 작성하시오
{
char arr[5];
}
return 0;
}
#include <iostream>
using namespace std;
void main()
{
//1. 출력값은?
{
int a;
int* p;
p = &a;
a = 2;
printf("%d\n", *p);
}
//2. 출력값은?
{
int num1 = 1;
int num2 = 2;
int* ptr;
ptr = &num1;
*ptr += 1;
ptr = &num2;
*ptr += 2;
printf("%d\n", num1);
printf("%d\n", num2);
}
//3. 출력값은?
{
int Arr[5] = { 0 };
int* pArr = Arr;
printf("%d \n", sizeof(Arr) + sizeof(pArr));
}
//4. 출력값은?
{
int num = 1;
int* pnum = nullptr;
pnum = #
cout << *&num + *&*pnum << endl;
}
//5. 출력값은?
{
int arr[] = { 1,2,3 };
int* pn = nullptr;
pn = arr;
*pn += 10;
pn++;
cout << *pn << endl;
}
//6. 출력값은?
{
int array[5] = { 10, 20, 30, 40, 50 };
int* p = array + 2;
++*p++;
printf("%d \n", *p); //값은 어떻게 될까요?
//printf("%d \n", array[2]);
//printf("%d \n", array[3]);
//printf("%d \n", ++*p++); //값은 어떻게 될까요?
}
//7. 출력값은?
{
int arr1[5] = { 1,2,3,4,5 };
char* p2 = (char*)arr1;
printf("%d", *p2++);
printf("%d", *p2++);
printf("%d", *p2++);
printf("%d", *p2++);
printf("%d", *p2++);
}
//8. 포인터 p 를 사용하여 배열의 값을 모두 더하세요.
{
int arr[5] = { 1,2,3,4,5 };
int* p = arr;
}
}
/// 스택
/// 함수, 배열, 전역변수
/// 인덱스 예외처리, 타입 1개로 고정
/// 2023.03.01 Sandy
// 외부 라이브러리 헤더 포함
#include <iostream>
using namespace std;
int g_Stack[10];
int g_Index = 0; // 값을 넣을 수 있는 곳을 가리킨다
// 스택 초기화
void ResetStack()
{
for (int i = 0; i < 10; i++)
{
g_Stack[i] = -1;
}
return;
}
/// <summary>
/// 스택의 내용을 출력한다
/// </summary>
void PrintStack()
{
for (int i = 0; i < 10; i++)
{
if (g_Stack[i] == -1)
{
cout << "[ ]" << " ";
}
else
cout << "[" << g_Stack[i] << "]" << " ";
}
cout << "\n\n";
return;
}
/// <summary>
/// 데이터 하나를 스택에 넣는다
/// </summary>
/// <param name="data"></param>
void PushDataToStack(int data)
{
if (10 <= g_Index)
{
cout << "스택이 가득 찼습니다\n";
return;
}
// 스택에 g_Index 이용해서 data 넣기
g_Stack[g_Index] = data;
g_Index++;
PrintStack();
return;
}
int PopDataFromStack()
{
if (g_Index <= 0)
{
cout << "스택이 비었습니다\n\n";
return 0;
}
int _result = 0;
// idx 스택의 탑, -1 해서 그 데이터 가져오기
_result = g_Stack[g_Index-1];
g_Stack[g_Index-1] = -1;
g_Index--;
cout << "스택에서 " << _result << "뺐습니다\n\n";
PrintStack();
return _result;
}
int main()
{
ResetStack();
PushDataToStack(10);
PopDataFromStack();
PopDataFromStack();
PopDataFromStack();
return 0;
}