본문 바로가기
반응형

C++93

100명의 죄수가 살아남을 확률을 높이기 위한 루프 전략 (Loop Strategy) C, C++ 전체 링크 무한히 작은 확률을 30%까지 올리는 기적의 전략 확률 1000000000000000000000000000000배 높이기 구현 with Veritasium https://www.youtube.com/watch?v=PE4vLbyOgw0 ▲ 유튜버 베리타시움의 영상인 퀴즈를 직접 구현해보자. 영상이 길다면 fmkorea의 요약본을 보자. 1부터 100까지 번호가 매겨진 죄수가 있다. 이때 각 죄수의 번호가 적힌 쪽지가 100개의 상자에 무작위로 담겨있다. 죄수들은 한 번에 한 명씩 방에 들어가서 50개의 상자를 열 수 있다. - 이때, 자신의 번호를 찾아야 한다. 50개를 모두 열어본 후에는 방을 들어왔던 상태와 완벽히 동일하게 복구하고 나가야 한다. 만약 100명의 죄수가 모두 자신.. 2022. 9. 24.
C, C++ - Window Visual Studio에서 폴더의 모든 파일 통합하기 C, C++ 전체 링크 참고 - 폴더, 파일 관리 함수 정리 with sys/stat.h, dirent.h, fstream isDirectory - 폴더 / 파일 체크 함수 getAllFilePath - 해당 경로를 모두 읽어오는 함수 deleteDirectoryFiles - 폴더, 파일 삭제 함수 deleteAllDirectoryFiles - 모든 폴더, 파일 삭제 함수 fileCopy - 파일 복사 함수 numOfDigits - 자릿수를 세는 함수 padStart - 자릿수의 빈칸을 앞부분부터 특정 문자로 채우는 함수 split - 특정 문자열 기준으로 분해하는 함수 getExtension - 파일의 확장자를 얻는 함수 아래와 같이 MyFiles 폴더가 있다고 하자. 여기에 있는 파일들을 한꺼번에 하.. 2022. 8. 9.
원주율 Pi : 라이프니츠 공식 (Leibniz Formula for π) C, C++ 전체 링크 라이프니트 원주율 공식은 아래와 같은 분모가 홀수인 값의 교대 급수에서 유도된다. 따라서 원주율 π (pi)는 교대 급수에 4를 곱한 값이 된다. precisionCount를 넘겨 받는 메서드를 만들어서 정밀도를 확인해보자. #include double pi(int precisionCount) { double leibniz = 0; int odd = 1; int inverse = 1; for (int i = 0; i < precisionCount; i++, odd += 2, inverse *= -1) { leibniz += 1 / (double)(odd * inverse); } return 4.0 * leibniz; } int main() { printf("%.15f\n", pi(.. 2022. 8. 1.
셔플 Shuffle - 카드 섞기 알고리즘 C, C++ 전체 링크 삼성 C형 전체 링크 1~10까지 카드가 있다고 가정하자. 이때, 카드를 N번(20) 적당히 섞어보자. stdlib.h를 선언하면 rand()함수를 이용할 수 있다. 카드가 총 10장이므로 카드의 size = 10으로 rand() % size를 하면 10장 중 1개의 카드를 랜덤으로 고를 수 있다. 카드를 2장 랜덤으로 골라 교환하면 카드가 섞인다. #include #include /* rand() 사용을 위한 선언 */ int main(void) { int N = 20; int card[] = { 1,2,3,4,5,6,7,8,9,10 }; int size = sizeof(card) / sizeof(int); for (int i = 0; i < N; i++) /* N번 교환 */ .. 2022. 7. 8.
Makefile 기본 예제 및 양식 Makefile example CC = g++ CFLAGS = -std=c++11 TARGET = test OBJECTS = main.o all : $(TARGET) $(TARGET): $(OBJECTS) $(CC) $(CFASGS) -o $@ $^ exec: ./test clean : rm *.o test main.cpp #include int main(void) { printf("hello!\n"); return 0; } 실행 $ make $ ls Makefile main.cpp main.o test $ ./test hello! 2022. 6. 12.
인터페이스 vs 추상 클래스 (Java, C++ 비교) C, C++ 전체 링크 인터페이스 vs 추상 클래스 (Java) 인터페이스 - 객체의 사용 방법을 정의한다. - 함수의 구현을 강제한다. - class 대신 interface 키워드 사용. - 상수와 메서드만을 가진다. 추상 클래스 - 상속을 위해 사용한다. - 추상 메서드를 가진다. - abstract 키워드 사용, new를 통해 객체 생성 불가. - abstract 메서드는 자식 클래스에서 반드시 구현해야 한다. (오버라이딩) 인터페이스와 추상 클래스 예시 청둥 오리와 모형 오리는 오리(Duck)을 상속한다. 이때 Duck은 추상 클래스다. 청둥 오리(Mallard)는 날 수 있다. 그러나 모형 오리(Model)는 날 수 없다. 따라서 fly()라는 행동은 FlyBehavior 인터페이스로 표현하고 .. 2022. 2. 5.
C++ - 순수 가상 클래스 (Pure Virtual Class) C, C++ 전체 링크 순수 가상 클래스는 순수 가상 함수를 가지는 클래스다. 순수 가상 함수는 virtual로 선언하고 끝에 = 0;이라고 표시한 함수다. 즉, 선언만 해두고 정의는 자식 클래스에 강요한다. 아래는 FOOD의 순수 가상 클래스다. #include #include using namespace std; class FOOD { public: FOOD() { cout 2021. 11. 10.
C++ - 가상 함수 테이블 (Virtual Function Table) C, C++ 전체 링크 virtual이 선언된 클래스가 있는 경우, 가상 함수 테이블은 rdata 섹션에 생성된다. 가상 함수 테이블(vtable)은 함수 포인터 배열이며, 이 포인터를 따라가면 가상 함수로 선언된 멤버 함수들의 주소에 배열 형태로 접근할 수 있다. 즉, 가상 함수 테이블이 실제 호출되어야 할 함수의 위치를 저장하고 있다. 가상 함수 테이블을 확인하기 위해 아래의 코드를 실행해보자. #include #include using namespace std; class FOOD { private: int price = 0; public: FOOD() { cout 2021. 11. 7.
C++ - 이동 생성자 (move constructor) C, C++ 전체 링크 함수가 클래스를 return할 때, 임시 객체가 생성되고 불필요하게 깊은 복사(deep copy)가 일어나게 된다. 임시 객체는 대부분 생성 직후에 소멸하기 때문에 내부 연산이 최소화하도록 코드를 최대한 줄여야 한다. 주로 함수의 return이 클래스인 경우에 대응해야 한다. 이러한 비용을 r-value를 이용해 생성자를 만들어 얕은 복사(shallow copy)로 해결할 수 있다. FOOD class에 아래와 같이 이동 생성자를 추가한다. class FOOD { private: int price = 0; public: ... FOOD(FOOD&& food) : price(food.price) { printf("FOOD move constructor, price : %d\n", p.. 2021. 10. 29.
반응형