1. Day02
- Blueprint 라이브 세션 및 과제
- 개인 공부
2. 라이브 세션
- 언리얼 에디터 둘러보기
- Type==world 같은 명령어로 검색 필터
- 과제 (머티리얼을 수정해서 적용)
3. 개인공부
- C++ 코딩테스트 완전정복 강의 (2-1, 2-2)
- 실버3 17626번 Four Squares (다이나믹 프로그래밍) 오답
- 처음에는 N 값을 2로 나눈다음 내려가면서 가장 큰 제곱수부터 빼기 방식으로 그리디하게 풀었으나 최소갯수가 아닌 반례가 존재함
// 실버3 17626번 Four Squares(다이나믹 프로그래밍)
#include <iostream>
#include <vector>
using namespace std;
vector<int> DP(50001, 0);
void P()
{
DP[1] = 1;
DP[2] = 2;
DP[3] = 3;
for (int i = 4; i <= 50000; i++)
{
int temp = i;
for (int j = i / 2; j > 0; j--)
{
if (j * j <= temp)
{
if (temp > 3)
{
temp -= j * j;
DP[i]++;
}
else if(temp <= 3)
{
if (temp == 3)
{
DP[i] += DP[3];
}
else if (temp == 2)
{
DP[i] += DP[2];
}
else if (temp == 1)
{
DP[i] += DP[1];
}
else
{
break;
}
}
}
}
}
}
int main()
{
P();
int N;
cin >> N;
cout << DP[N] << '\n';
return 0;
}
- 점화식 jj ≤ i 일때 DP[i] = min(DP[i - jj] + 1) 을 사용하여 정리
- i를 1부터 증가시키면서, 각 DP[i]를 구할 때
- j²(1², 2², 3², ...)을 작은 것부터 하나씩 선택한다
- 이미 계산해둔 DP[i - j²]에 1을 더한 값들을 비교한다
- 그 중 최솟값이 DP[i]가 된다
// 실버3 17626번 Four Squares(다이나믹 프로그래밍)
#include <iostream>
#include <vector>
#include <algorithm> // min()을 사용하기위해 추가
using namespace std;
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
int N;
cin >> N;
// min()로 최솟값 갱신을위해 1e9 == 충분히 큰 값으로 초기화
vector<int> DP(N + 1, 1e9);
DP[0] = 0;
for (int i = 1; i <= N; i++)
{
// j의 제곱이 i보다 작을때 까지 체크
for (int j = 1; j * j <= i; j++)
{
// i에서 제곱수 j²를 뺀 나머지의 최솟값(이미 계산됨)에 1을 더한 것들 중 가장 작은 값이 DP[i]
DP[i] = min(DP[i], DP[i - j * j] + 1);
}
}
cout << DP[N] << '\n';
return 0;
}
4. 개인 사정으로 인한 조퇴 주말에 알고리즘 강의 및 문제 보충 필요
5. 다음주차 일정 : 라이브 세션 및 개인공부