1. 본캠프 시작
- 본캠프 OT
- Chapter 1 Blueprint 세션 및 과제
- 개인 공부
2. 본캠프 OT
- 간단한 부트캠프 소개와 튜터님들 소개
- 앞으로의 커리큘럼
- 기타 필수 공지 안내
3. 개인공부
- C++ 코딩테스트 완전정복 강의 (1-2, 1-3)
- 비주얼 스튜디오 환경 C++17버전으로 셋팅 (이전까지는 C++14였음 어쩐지 알고리즘 문제풀랑 다르더라...)
- 효율적인 공부법 : 단순 문제풀이X 지금까지 푼 문제 통계를 보고 취약한 유형의 문제에 집중 (하기싫어서 미루던 BFS, DFS, 그래프 문제들...)
- 효율적인 풀이 : 문제요약(3문장요약: 요구 성능, 예외사항, 키워드) → 입출력 분석(예시 입력 작성) → 전략 설계(예시 입력 작성) → 구현(전체 과정의 30%)
- 실버3 9461번 파도반 수열 (다이나믹 프로그래밍)
- 첫 시도에 방법은 맞았으나 N == 100일때 출력이 -가 나옴 N == 100부터 거슬러올라가다 정상적인 출력에서 10억이 넘어가는 것을 발견 == 오버플로우
- int로 받던 것들을 long long으로 수정하여 해결
// 실버3 9461번 파도반 수열(다이나믹 프로그래밍)
#include <iostream>
#include <vector>
using namespace std;
vector<long> P(101, 0);
long long DP(int N)
{
P[0] = 0;
P[1] = 1;
P[2] = 1;
P[3] = 1;
P[4] = 2;
for (int i = 5; i <= N; i++)
{
P[i] = P[i - 1] + P[i - 5];
}
return P[N];
}
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
int T;
cin >> T;
for (int i = 0; i < T; i++)
{
int N;
long long result;
cin >> N;
result = DP(N);
cout << result << '\n';
}
return 0;
}
// 실버3 9461번 파도반 수열(다이나믹 프로그래밍) 개선
#include <iostream>
#include <vector>
using namespace std;
vector<long long> P(101, 0);
void DP()
{
P[0] = 0;
P[1] = 1;
P[2] = 1;
P[3] = 1;
P[4] = 2;
for (int i = 5; i <= 100; i++)
{
//P[i] = P[i - 2] + P[i - 3]도 같은 결과 대신 P[1] = P[2] = P[3] = 1; 로 좀더 깔끔하게 초기 입력가능 i = 4 부터
P[i] = P[i - 1] + P[i - 5];
}
}
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
//for 문안에서 매번 호출하는 것 보다 한번만 호출 해준다음 For문에서는 N만 입력해서 해결
DP();
int T;
cin >> T;
for (int i = 0; i < T; i++)
{
int N;
cin >> N;
// 위에서 DP()를 호출해서 이미 저장되어있는 P배열 중에 P[N]를 출력
cout << P[N] << '\n';
}
return 0;
}
- 실버3 1172번 타일링2 (다이나믹 프로그래밍)
- 비슷한 다이나믹 프로그래밍은 이전에도 풀어봤으나 이번에는 2 x 2 블록이 추가된 형태 이전의 규칙과는 달라 점화식을 다시 찾아야했음
- 지금까지의 경험으로는 처음부터 점화식의 규칙을 찾기보다는 일단 손계산을 하며 점화식을 고려하는 것이 좋았음 이에 바로 계산부터 시작해 패턴을 찾음 (그림판에 무작정 그리는 것도 방법)
- (DP[i - 1] * 2)에서 짝수일경우 + 1 홀수일경우 -1로 계산되는 것을 확인 바로 적용하고 % 10007 로 오버플로우 방지 정답 확인 후 찾아보니 DP[i] = (DP[i - 1] + 2 * DP[i - 2]) % 10007 로 푸는 방법도 있었음
// 실버3 11727번 타일링2(다이나믹 프로그래밍)
#include <iostream>
#include <vector>
using namespace std;
// 어차피 10007로 나눈 나머지를 저장해 갈건데 굳이 long long을 안써도 됐을것 같음
vector<long long> DP(1001, 0);
void P()
{
DP[1] = 1;
DP[2] = 3;
DP[3] = 5;
// 아래 for문 DP는 배열을 0부터 1000까지 1001개 할당했는데 DP[1001]에 접근해서 문제가 생김 1000까지로 조정해서 해결함
for (int i = 4; i <= 1000; i++)
{
if (i % 2 == 0)
{
DP[i] = ((DP[i - 1] * 2) + 1) % 10007;
}
else
{
DP[i] = ((DP[i - 1] * 2) - 1) % 10007;
}
}
}
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
P();
int N;
cin >> N;
cout << DP[N] << '\n';
return 0;
}
4. 내일 일정
- 라이브 세션 참가 및 개인 공부
til, 내일배움캠프, 사전캠프, 알고리즘, 언리얼, 해시 맵