23-03

Sandy·2024년 3월 6일

[Today I Learned]

목록 보기
3/18

230307_그래픽스

물체의 노말벡터를 이용해서 stylized rendering를 사용했다.

C언어에서 함수를 호출하고 변수를 쓰는 것이 MOV, PUSH, CALL 등으로 내부적으로 쪼개져서 작동한다.

행렬 계산, 라이팅, 그림자 처리, 퐁세이딩, 비트맵 등

컴퓨터 구조에서 여러 레지스터가 있고 하나씩 명령어가 실행되고 어떻게 실행중인 프로그램의 변수를 저장하는지

230308_런타임

컴파일타임 런타임 런타임에서 메모리 할당하게 하기

230309_함수포인터,객체

바이트 단위로 주소가 지정된다.

int ptr == (int ) malloc(sizeof(int)); : malloc은 void리턴해서 int *로 캐스팅

int (add_ptr)(int, int) = &add; // add 함수를 add_ptr함수 포인터에 연결

디자인 패턴 component가 유니티에서 컴포넌트이다.

프로그램이 메모리에 올라가 있는 상태가 프로세스이다.

한글이 윈도우-맥사용하면서 깨지는 이유?

하나의 코어에서 프로세스를 하나 돌리는지 스레드를 하나 돌릴 수 있는지
-> 스레드 하나이다.

변수가 어떻게 메모리의 주소와 연결?
-> 함수가 호출되면 변수가 스택에 저장된다

함수 포인터?
-> 함수의 주소값을 저장한다. 함수 반환하는 함수, 함수 매개변수로 받기 가능하다. 함수 동적으로 생성, 실행

함수 포인터랑 함수객체 차이?

함수 객체?
-> 클래스나 구조체의 객체로서, 함수 호출 연산자 ()를 오버로딩하여 함수처럼 동작하게 만들어진 객체

cout이 객체?

230310_엔디언

리틀 엔디언 : 타입읽기, 형변환 빠름, 수학적 연산 쉬움

빅 엔디언 : 사람이 보기 편함, 네트워크 바이트 오더에서 사용

메모리에서 동적할당을 할 때 왜 힙 구조를 이용해서 저장하지?

230311_알고리즘이해도

개념을 설명할 수 있는 것

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

유니티레이어 쓸때 써봤는데 전혀 모르겠다

숫자를 비트연산해서 빠르게 계산한다

개념 작동방식 구현 모른다

230313_알고리즘

Broad Phase 알고리즘

→ 충돌 감지를 하는 원과 비교 대상이 되는 원들 간의 거리를 계산하여 미리 일정 범위 내에 있는 원들을 선택하고, 이들만 충돌 감지를 진행하도록 구현

Kruskal

→ 비용 작은 엣지 순서로 추가해서 사이클 없게 MST만들기

cpp_dec_float_50

50자리 부동소수점

Axis Aligned Bounding Box (AABB)

박스 minPoint, maxPoint를 잡아서 다른 박스의 min, max 포인트와 비교해서 교차하는지 체크

if (a.maxX < b.minX || a.minX > b.maxX) return false;

long double

double보다 수학계산 할 때 정확하게 쓸 수 있다.

HashTable이 O(1)인 이유?

해시함수 O(1), 해시값으로 idx 사용 O(1)

230314_수학용어

같은 기울기를 가지는 것을 어떻게 판단하지? y / x 할 때 x가 0인 상태면?

x가 0인 곳만 예외처리하기, long double 형으로 더 정확하게 쓰기

공간 분할 기법(Spatial Partitioning)

그리드나 트리 구조로 공간을 분할해서 연산량을 줄인다. 쿼드트리로 2D를 4분할해서 재귀적으로 관리한다.

정수 Integer (Z)

수를 1차원 벡터화 했다. 허수는 숫자를 2차원 벡터화 한 것이다.

유리수 rational number (Q)

ratio + nal 정수의 비율로 나타낼 수 있는 수 비율적인 수

무리수 irrational number (I)

정수의 비율로 나타낼 수 없는 수 PI, e, 루트2

실수 real number (R)

유리수 + 무리수

허수 imaginary number (i)

제곱해서 음수 되는 수

복소수 complex number (C)

실수부 + 허수부 복소평면에서 i를 곱할 때마다 반시계방향으로 회전한다.

PI가 반원의 길이인 이유

그렇게 쓰기로 약속, 이미 써와서 편함

FSM finate state machine

경우에 대한 선택지를 정해 놓음

차원?

위치를 표현하는데 필요한 숫자의 개수

Shader

GPU에서 코딩할 수 있도록 하는 도구

GPU

동시에 변수 처리하는 것이 막혀있다. 제조사에서 잘 만들어놓았다.

항등원 0, 1

연산 했는데 결과 바뀌지 않는 것

역원

연산을 했을 때 항등원이 나오는 것 3, 1/3

Stable Diffusion

text-image model 확산을 안정적으로 시뮬레이션한다.

편미분 partial derivative

다변수함수에서 한 개의 변수에 대해서만 미분하는 것

경사하강법 (그라디언트 디센트)

매개변수를 업데이트하면서 값을 구한다. 편미분을 계산해서 어떤 방향으로 갈지 찾는다.

Kernel

운영체제에서는 HW-SW 인터페이스

GPU에서는 병렬처리 함수 벡터 덧셈, 행렬 곱셈 동시에 처리한다

GPGPU

General-Purpose Graphics Processing Unit

프로세스(Process) 기반 동시성 모델

CPU 독립된 메모리 공간을 가진 프로세스들이 별도로 실행되면서 동시에 작업을 수행

스레드(Thread) 기반 동시성 모델

GPU 하나의 프로세스 내에서 여러 개의 스레드가 동시에 실행되면서 작업을 수행하는 모델

IPC (Inter-Process Communication)

프로세스 간의 상호작용

파이프(Pipe) 소켓(Socket) 메시지큐(Message Queue) 공유 메모리(Shared Memory)

CUDA

GPU에서 실행되는 병렬 코드를 작성할 수 있다

cout 객체인 이유

<<를 오버라이딩해서 출력하도록 한다.

230315_컴퓨터구조

컴퓨터의 구조

CPU + IO + RAM + SDD + GPU

컴퓨터의 작동방식

CPU가 프로그램을 메모리에 올려서 실행되게 한다

메모리에서는 코드 데이터 힙 스택 영역이 있다.

엘런 튜링, 폰 노이만

엘런튜링 : FSM

폰 노이만 : CPU-Memory-IO 버스를 이용한 데이터 교환 모델

운영체제(OS)

SW가 HW위에서 돌아갈 수 있도록 한다

CPU가 언제 어떤 프로세스를 실행할지 스케쥴링한다

프로세스간에 통신할 수 있도록 한다.

CPU와 메모리

CPU는 메인메모리에 데이터를 요청한다

CPU 안 메모리 = 레지스터에 명령어와 변수를 쌓아놓고 ALU에서 계산한다

이진수와 16진수 표기법

2진수 :

16진수 : 0x1 ~ 0xF

비트와 바이트

Bit : 0, 1

Byte : 8Bit

킬로바이트, 메가바이트, 기가바이트

KByte : 1024Byte

MByte : 1KB * 1024

GByte : 1MB * 1024

키비바이트, 메비바이트

1000 씩 곱해진다

Byte Order ( 리틀 엔디안 VS 빅 엔디안 )

리틀 엔디안 : 뒤에서부터 읽기

빅 엔디안 : 앞에서부터 읽기 네트워크 표준

음수의 표현

signed type에서 가장 앞 비트가 1이면 음수이다

소수점 표기방식

부동소수점 : IEEE 숫자 표시

float : 소수점 아래 1/2, 1/4로 표시

double : 표현할 수 있는 범위 8byte

문자의 표현

‘a’

아스키코드와 유니코드

아스키코드 : 키보드에 있는 문자

유니코드 : OTF-8 OTF-16

문자열 표현

char a[10];

뒤에 \0 == null을 붙힌다.

서식표현

\ : 여러가지 출력할 때 쓰는 표현

이스케이프 문자

\n : 다음 줄로 바꿔서 출력한다

폰 노이만 구조

내장형 프로그램 방식

명령어와 데이터를 동등하게 기억장치에 저장

Socket

프로세스 간에 데이터를 공유할 때 포트를 통해 한다

각각 PC의 포트를 담당하는 소켓은 각각 하나의 프로세스이다.

Byte Order ( 리틀 엔디안 VS 빅 엔디안 )

Big : 0x12, 0x34, 0x56, 0x78

Little : 0x78, 0x56, 0x34, 0x12

2의 보수

양수 비트 반전해서 +1 해서 음수를 표현한다.

아스키코드와 유니코드

아스키코드 : 0~127 + ParityBit

유니코드 : UTF-8 일반적 사용(빅엔디안) UTF-16 MS Window 커널 내부 인코딩(리틀엔디안)

Stream

stdio 표준 입출력 스트림

이스케이프 문자

\ : 여러가지 출력할 때 쓰는 표현

문자의 표현

인코딩 : 문자 → 이진수 숫자

문자열 표현

문자열 상수 : 이름 x, 문자열 내용 변경 불가

컴퓨터 구조

CPU + Memory + IO + Bus + Secondary Storage

문자의 표현

문자 하나를 숫자 하나에 대응시킨다

운영체제(OS)

HW와 응용 프로그램 사이의 인터페이스 역할을 담당하는 시스템 소프트웨어

커널 + 서비스 프로그램

컴퓨터의 작동방식

입력을 받아서 처리를 해서 출력한다.

CPU

ALU + Control Unit + Registers

Main Memory

CPU와 직접 데이터 교환을 할 수 있다

이진수 표기법

0b1010

소수점 표기방식

부호 + 지수부 + 가수부

float : 4byte

double : 8byte

230316_C_C++_C#

RAM에서 Heap과 자료구조 Heap은 관계없는데 이름이 Heap인 이유

Automatic Storage : Stack

Dynamic Storage : Heap

Static Storage : Data

Thread-Local Storage : 각 스레드가 자신만의 스택 메모리 공간을 가진다.

const char* str = “Abc”;

문자열을 쓸 때는 맨 뒤에 \0이 있도록 약속되어있다.

Property

클래스 안 private 값을 처리할 수 있도록 한다.

get, set으로 어떻게 할지 커스텀 할 수 있다.

BufferedStream

Stream을 상속해서 버퍼에 여러개를 모아서 큰 단위 입출력을 효율적으로 한다

파일 및 네트워크에서 대용량 데이터를 읽거나 쓸 때 IO성능을 향상시킨다

230317메모리주소관리

Object Pooling

리소스 삭제 생성 횟수를 줄이기 위해서 미리 풀에다가 넣어놓고 필요할 때 쓴다

Garbage Collection

사용하지 않는 객체를 자동으로 탐지해서 해제한다

sizeof()

함수가 아니라 연산자이다

충돌 체크할 물체 줄이는 방법

레어어설정

간격 조정 : 불완전해질 수 있음

영역 제한

최적화 알고리즘 : AABB

C++ 스마트포인터

포인터를 감싸는 클래스

unique_ptr : 한 객체에 대해서 하나만 생성한다

shared_ptr : 참조 횟수를 계산한

weak_ptr : 참조를 유지하지 않고 객체를 관찰해서 shared_ptr사라지면 삭제한다

연산자 오버로딩

연산자를 정의해서 쓸 수 있다

다형성 오버라이딩

여러 클래스가 동일한 메소드 이름을 가질 수 있다

상속, 가상함수를 통해 구현된다

오버라이딩

객체가 어떤 타입인지에 따라 실행되는 메소드가 결정된다

Lvalue / Rvalue

L : 주소가 있는 변수

R : 임시 변수

C NULL / C++ nullptr ≠ NULL

nullptr_t 타입

포인터의 값이 없다 → 오버로딩한 함수 호출 명확히 구분

연산자 함수 Operator Function

연산자 오버로딩으로 원하는대로 정의할 수 있다

RAII패턴 Resource Acquisition Is Initalization

생성자 : 메모리 할당

소멸자 : 메모리 자동으로 해제

선형 메모리에서 메모리 파편화

스택, 힙, 실행 코드 영역이 분리되지 않고 메모리의 일정한 위치에 할당되어있다.

할당 해제 반복하면서 작은 조각으로 나누어져서 사용하지 못하게 된다

const char *text / const char text[]

문자열 리터럴이 메모리에 상수로 저장된다

포인터를 수정할 수 없도록 const로 보호한다

230320_abstract,virtual

abstract virtual

abstract : 해당 method의 기본 구현을 제공하지 않고, 하위 클래스에서 무조건 method를 구현한다

virtual : 해당 method의 기본 구현을 제공하면서, 하위 클래스에서 필요에 따라 해당 method를 override 한다

abstract

객체로 만들 수 없고 상속으로 하위 클래스에서 구현한다

virtual

클래스 선언에서 사용할 수 없다

async() future promise()

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;
}

230321_해야할일

Reflection

객체의 정보를 런타임 중에 가져와 분석할 수 있다

게임엔진 만들 때 인스펙터를 만들기 위해서 사용한다

해야할 것들

코테 통과 수준 : 문제 하루에 한 개씩 풀기

opengl : 과제 정리하기, 시험 다시 풀기, 설명 써 놓기

수학 : 알아야 할 키워드 정리해놓기 강의노트 보고 체크하기

javidx9 강의 쭉 듣기 → 클론코딩하기

rookiss 강의 쭉 듣기 → 클론코딩하기

면접 준비하기 : 기출 정리하기

IL2CPP

인터프리터 언어를 cpp로 바꿔준다 C#의 성능을 올려준다

230322_연산자

연산자

cast : (int)

comma : func(a, b)

scope resolution : std::

pointer to member : obj.member, objPtr→member

typeid : 객체 타입

., → 연산자

obj.member : 객체 내 변수, 함수에 접근한다

objPtr→member : 객체의 포인터로 변수, 함수에 접근한다

Boost C++ Libraries

typeid는 타입 정보만 제공한다

객체 내부구조, 속성정보 확인 → 객체 상태분석, 직렬화

클래스, 메서드 이름 → 런타임에 클래스, 메서드 동적으로 호출

상속, 다형성 지원

operator overloading

같은 연산자를 데이터 타입에 따라 다르게 동작하도록 설정한다

함수 호출이 아니라 operator를 이용한다

overloading

다양한 인자 형태에 대응하기 위해 여러 정의를 만든다

230323_i++,++i_assembly

i++ ++i Assembly Code

// 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를 사용해야한다

230327_채울 수학 개념

적분

구분구적법

자연상수 e

오일러공식

오일러공식 오리지널 버전

테일러급수

테일러 급수 → 오일러 공식

미적분 → 오일러 공식

오일러 공식 용도

Polor form (복소수의 극형식)

푸리에 변환

2차방정식 근의공식

등차수열

등비수열

수열 & 급수

등차급수

등비급수

멱급수

테일러 급수

매클로린 급수

삼각비

삼각함수

원 좌표계 → 삼각함수

테일러 급수전개 → 삼각함수

호도법

회전행렬

기저벡터

선형변환

X, Y축 회전 기저 변환행렬

y = Asin(Bx +C) + D

STL set

Normalize

내적 Dot product = Scalar Product

내적 → cos() 값

내적 → 확산광 계산

내적 → 가시성 판단

Rim Light

내적 → 방향계산

내적 → 투영

외적 Cross product = Vector product

외적 → 면의 법선벡터

외적 → 평행사변형 면적

Vector.Dot(a, b)

Vector.Cross(a, b)

Vector.Reflect(a, n)

Vector.ProductionPlane(a, n)

행렬

행렬 ↔ 벡터

행벡터

열벡터

TRS (Translation, Rotation, Scale)

인접행렬

단위행렬

행렬식

가역행렬

라플라스 전개식

Matrix.Determinant()

Matrix.Inverse(M)

Complex Plane

극좌표

회전행렬

오일러 행렬

짐벌락

주대각선

Identity Matrix (항등행렬)

전치행렬

행렬곱셈

행렬 곱셈 ↔ 벡터 내적

N차 행렬식

소형렬식

여인자

정방행렬

역행렬

원기둥좌표계

구면좌표계

변환 - Translation

변환 - Rotation

변환 - 전치행렬

회전변환 - 오일러 변환

크기변환

Rigid Body 변환

Homogeneous (동차좌표계)

Quaternion (사원수)

사원수의 곱셈

사원수 벡터의 적용

사원수 행렬로 표현

Matrix vs Quaternion

Conjugate of complex

Norm of complex

Quotient of complex

Complex Plane & 2차원 변환행렬

Quaternion & Cross Product

Q - ordered pair

Q - addition

Q - scalar product

Real Quaternion

Pure Quaternion

Unit Quaternion

Binary form of Quaternion

Quaternion Conjugate

Quaternion Norm

Quaternion Normalization

Quaternion Inverse

Quaternion Dot Product

Quaternion Rotation

Quaternion ↔ Matrix

Q - Interportaion

Q - 4번째 성분

직선 - 한 점

직선 - 두 점

평면

충돌 - 직선과 평면

면의 법선과 직선이 수직

점 포함 테스트

위치관계 파악

충돌 - 원과 직선

충돌 - 직선과 원기둥

Rendering Pipeline

Transform

Transform Pipeline

로컬 좌표계

월드 좌표계

월드 변환(TM 적용)

카메라 좌표계

직교 투영 좌표계

원근 투영 좌표계

원근 투영 변환

뷰포트 변환

Ambient Light

Directional Light

Point Light

Spot Light

Ambient + Diffuse + Specular

반사벡터

Per Vertex Light

Per Pixel Light

Stylized Rendering

Toon Shading

LUT

Cartoon - Specular

Cartoon - Rim

Matcap Shader

LUT + 프랍

LUT vs Curve

후면 Culling

절두체

평면의 방정식

경계입체 - 구, 상자, 실린더

BRDF (Bidirectional Reflectance Distribution Function 양방향 반사 분포 함수)

BRDF Specular 계산

F 프레넬 항

G (Geometric Attenuation Factor 기하감쇠율)

D (Normal Distribution Function 미세면 분포함수)

Disney Diffuse (PBR in Diffuse)

접선공간

Gram-Schmidt Algorithm

TBN Vector

Linear Algebra

Dimention

벡터의 정의

Vector Space

Basis Vector

Orthogonal Basis

Linear Combination

Span

Linearly Dependent

Linearly inDependent

Linear Transform

회전행렬

Norm Space

Determinant

Eigen Vector

Eigen Value

Trace

역함수

삼각함수의 역함수

삼각함수 → 회전행렬

2차원 회전행렬

삼각비의 항등식

일반각에 대한 삼각비

음의 각에 대한 삼각비

pi +- seta에 대한 삼각비

pi / 2 +- seta에 대한 삼각비

삼각비의 덧셈정리

삼각비의 배각공식

삼각비의 반각공식

삼각비 곱 → 합 or 차 로 고치는 공식

삼각비 합 or 차 → 곱으로 고치는 공식

삼각함수 미분 공식

삼각함수 적분 공식

역삼각함수 미분 공식

삼각함수 정적분 공식

Homogeneous Coordinates

Affine Space

변환 파이프라인

투영 변환 유도

뷰포트 변환

y = e^x 그래프

연립방정식의 도식

sin & cos & tan

sin cos tan 특수 값

속력 = 주파수 * 파장

LERP (Linear Interpolation)

SLERP (Spherical Linear Interpolation)

Easing Function

Normal Distribution

Positive Skewness

Negative Skewness

표준편차

상관관계

인과관계

데이터 정규화

베이즈의 정리

Probability Mass Function (확률질량함수)

Cumulative Distribution Function (누적분포함수)

Probability Density Function (확률밀도함수)

엘로 평점 시스템

230328_수학개념

역수 & 역함수

역수 : 분모와 분자 바꾸었다

역함수 : 입력값와 출력값의 순서를 바꾸었다

벡터의 외적 방향?

DX에서는 왼손 좌표계를 사용한다

230330_포인터

arr[i] == *(arr+i)

포인터에 더하면 자료형의 크기만큼 더해진다

렌더링 파이프라인

입력 → 정점 셰이더 → 기하 셰이더 → 픽셀 셰이더 → 출력

int arr[10] == int (arr[10])

int* 저장하는 10칸 배열 만든다

230331_포인터,배열,스택

#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 = &num;
		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;
}

0개의 댓글