1. 파도 조명 예제를 빨간빛만 방출하도록 수정하고, 빛의 세기가 진동하게 해서 빛이 껌벅이는 것처럼 수정하라. UpdateMainPassCB에 Light 객체의 Strength를 변경하면 된다. void LitWavesApp::UpdateMainPassCB(const GameTimer& gt) { mMainPassCB.Lights[0].Strength = { sin(gt.DeltaTime() * 2000.f), 0.0f, 0.0f}; } 2. 파도 조명 예제에서, 재질들의 거칠기를 여러 가지로 변경하면서 시험해 보라. 언덕의 거칠기를 0, 파도의 거칠기를 1로 했을 때의 결과 void LitWavesApp::BuildMaterials() { grass->Roughness = 0.0f; water->Ro..
문제 2230번: 수 고르기 N개의 정수로 이루어진 수열 A[1], A[2], …, A[N]이 있다. 이 수열에서 두 수를 골랐을 때(같은 수일 수도 있다), 그 차이가 M 이상이면서 제일 작은 경우를 구하는 프로그램을 작성하시오. 예를 들어 www.acmicpc.net 풀이 정렬, 두 포인터 문제이다. 입력받은 수열을 정렬한다. start와 end를 0에서부터 시작한다. start와 end에서의 수의 차이가 M이상이라면 답을 갱신한다. 차이를 더 줄이기 위해 start를 증가시킨다. 미만이라면 차이를 더 늘리기 위해 end를 증가시킨다. 코드 #include #include #include using namespace std; int nums[100000]; int main() { ios_base::s..
문제 2531번: 회전 초밥 첫 번째 줄에는 회전 초밥 벨트에 놓인 접시의 수 N, 초밥의 가짓수 d, 연속해서 먹는 접시의 수 k, 쿠폰 번호 c가 각각 하나의 빈 칸을 사이에 두고 주어진다. 단, 2 ≤ N ≤ 30,000, 2 ≤ d ≤ 3,000, 2 ≤ www.acmicpc.net 풀이 브루트포스 알고리즘, 두 포인터, 슬라이딩 윈도우 문제이다. 두 포인터는 구간의 넓이가 유동적으로 변하고, 슬라이딩 윈도우는 구간의 넓이가 고정적이다. 현재 문제에서 회전 초밥은 연속으로 k개 집어야 하므로 구간이 고정적이기 때문에 슬라이딩 윈도우로 풀어야 한다. 슬라이딩 윈도우 방식에서 구간을 한칸 옮겼을 때, 모든 구간을 다시 검사하는 것 보다 변한 구간. 즉, 맨 왼쪽과 맨 오른쪽만 계산하는게 더 빠르다. ..
55: Boo子有親! 부스트를 늘 여러분 가까이에 부스트는 C++ 개발자들의 단체이자 무료 다운로드가 가능한 C++ 라이브러리 집합을 동시에 일컫는 고유명사이다. 물론 C++만 다루는 개발자 단체 및 웹사이트는 부스트 말고도 정말 많다. 하지만 부스트는 다른 곳과는 다른 차별점이 있다. 첫째, 부수트는 C++ 표준화 위원회와 밀접하고 영향력 있는 밀월관계를 유지하고 있는 곳으로 유일하다. 둘째, 라이브러리 승인 과정이다. 이곳의 승인 과정은 공개 동료 심사(public peer review)에 기반을 두고 있다. 부수트의 라이브러리 군단은 크게 십수 개의 범주로 나뉘어 있다. 문자열 및 텍스트 처리 타입 안정성을 갖춘 printf 비슷한 서식화 기능, 정규 표현식 및 토큰화와 구문분석 기능 컨테이너 ST..
문제 풀이 두 포인터 문제이다. start와 end를 0에서부터 시작하여, end의 수는 수열에 추가하고, start의 수는 수열을 추가할 수 없을 때 수열에서 제거하는 방식으로 start와 end를 증가하거나 감소시킨다. 원본 수열을 nums라고 하면, nums[end]는 현재 부분 수열에 추가하려는 수이다. nums[start]는 수를 추가할 수 없을 때, 부분 수열에서 제거하는 수이다. 코드 #include #include using namespace std; int nums[200'000]; int num_count[100'001]; int main() { ios_base::sync_with_stdio(0); cin.tie(NULL); cout.tie(NULL); int N, K; cin >> N..
54: TR1을 포함한 표준 라이브러리 구성요소와 편안한 친구가 되자 C++98에 명시되어 있는 표준 C++ 라이브러리의 주요 구성요소를 한 번 되짚어 보자. 표준 템플릿 라이브러리(Standard Template Library, STL) 컨테이너(vector, string, map 등), 반복자, 알고리즘(find, sort, transform 등), 함수 객체(less, greater 등) 외에 이런저런 컨테이너 어댑터와 함수 객체 어댑터(stack, priority_queue, mem_fun, not1 등)가 있다. iostream 사용자 정의 버퍼링, 국제화 기능이 가능한 입출력을 지원하며, 그 외에 cin, cout, cerr, clog 등의 사전정의 객체를 지원한다. 국제화 지원 수치 처리 지..
53: 컴파일러 경고를 지나치지 말자 심각한 문제라면 에러가 나올 것이라고 생각하고 경고를 무시하면 안 된다. C++의 경우에는 우리가 저질러 놓은 코드가 어떤 것인가에 대해 컴파일러 제작자가 우리보다 더 잘 이해하기 있기를 바라는 것 자체가 큰 도박이다. class Base { public: virtual void f() const; }; class Derived : public Base { public: virtual void f(); }; 위의 코드는 가상 함수인 B::f 를 D::f 에서 재정의(redefine, 오버라이드)하겠다는 의도인데, 여기에 실수가 있다. B클래스의 f 함수는 상수 함수지만 Derived 클래스의 f는 괄호 뒤에 const가 없다. 이러면 책의 필자의 컴파일러는 다음과 같..
문제 풀이 누적 합 문제이다. 보드가 격자로 칠해져 있기 때문에, 칠해야 하는 칸을 누적 합으로 구해야 한다는 것을 생각하기 힘들었다. 보드판의 첫 칸이 검정색인 보드와, 하얀색인 보드로 나눠서 생각한다. (i, j)칸 까지, 각 보드칸에서 칠해야 하는 칸의 수를 누적 합으로 구해놓는다. i + j 가 짝수라면, 첫 칸의 색과 같은 색상이어야 한다. 홀수라면, 다른 색상이어야 한다. 이런 식으로 (i, j)칸을 탐색하며 누적 합을 구한다. 구한 2차원 누적 합에 K X K칸을 잘라냈을 때의 누적 합의 최솟값을 찾는다. 코드 #include #include #include using namespace std; char board[2001][2001]; int sum_black[2001][2001]; int..
문제 풀이 누적 합 문제이다. https://kantatatam.tistory.com/143 [백준][C++] 30508: 고인물이싫어 문제 풀이 그래프 탐색, 누적합 문제이다. 횡단보도의 칸 중에서 물이 빠질 칸을 BFS로 탐색한다. BFS의 시작은 하수구 칸에서 시작한다. 현재 탐색 중인 칸의 상하좌우 칸 중에서, 현재 칸의 높이 kantatatam.tistory.com 2차원 배열의 누적 합을 구하는 문제로 위 문제와 풀이가 같다. 코드 #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; c..
52: 위치지정 new를 작성한다면 위치지정 delete도 같이 준비하자 Widget* pw = new Widget; 위의 코드는 항목 17에서도 말했듯이, operator new와 Widget의 기본 생성자, 두 개의 함수가 실행된다. 여기서 두 번째 함수 호출이 진행되가가 예외가 발생했다고 가정하자. 이 경우 이미 끝난 메모리 할당을 취소하지 않으면 안된다. 사용자 코드에서는 이 메모리를 해제할 수 없다. 따라서 1단계의 메모리 할당을 안전하게 되돌리는 중대 임무는 C++ 런타임 시스템이 맡아 준다. C++ 런타임 시스템이 해 주어야 하는 일은 operator new와 짝이 맞는 버전의 operator delete를 호출하는 것이다. 우리가 사용하고 있던 기본 new, delete는 그다지 대수로운 ..