BOJ 1699 (제곱수의 ν•©)
Β - Last update: 2023-08-16

μ˜€λžœλ§Œμ— tag: DP둜 κ²€μƒ‰ν•΄μ„œ ν’€μ–΄λ³Έ 문제. DP λ¬Έμ œλŠ” μ‹€λ²„κΉŒμ§€λŠ” ꡉμž₯히 μž¬λ―Έμžˆλ‹€. κ³¨λ“œλΆ€ν„°λŠ” 관찰이 μ’€ μ–΄λ €μ›Œμ Έμ„œ 풀이가 νž˜λ“€μ§€λ§Œ.. (23λ…„ 8μ›” κΈ°μ€€) PS의 빈좜 μ˜μ—­μ΄κΈ° λ•Œλ¬Έμ— κΎΈμ€€νžˆ μ—°μŠ΅ν•΄μ•Ό ν•œλ‹€.

풀이

이 문제 같은 경우 수의 λ²”μœ„μ— μ£Όλͺ©ν•΄λ³΄λ©΄ N≀10000N \leq 10000 인데, O(N2)O(N^2)λ‘œλŠ” TLEκ°€ λœλ‹€. κ·Έλž˜μ„œ 쑰금 머리λ₯Ό ꡴렀보면, 루프 μ•ˆμͺ½μ—μ„œ 돌 λ•ŒλŠ” 수의 λ²”μœ„κ°€ μ œκ³±μˆ˜μ΄λ―€λ‘œ O(NN)O(N \sqrt N)의 풀이법을 λ– μ˜¬λ¦΄ 수 μžˆμ—ˆλ‹€.

1μ°¨ μ •λ‹΅ μ½”λ“œ

λ‹€λ§Œ λͺ¨λ“  N에 λŒ€ν•΄μ„œ μ΅œμ†Œκ°€ λ˜λŠ” 제곱 수의 ν•©μœΌλ‘œ λͺ‡λ²ˆλ§Œμ— μ—…λ°μ΄νŠΈ λ˜λŠ”μ§€μ— λŒ€ν•œ 확신이 μ—†μ–΄μ„œ set을 μ„žμ–΄μ„œ ν’€μ΄ν–ˆλ‹€. λ‚˜μ€‘μ— μƒκ°ν•΄λ³΄λ‹ˆ ν•„μš”κ°€ μ—†λŠ” κ³Όμ •μ΄μ—ˆμ§€λ§Œ..

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
int main() {
int N; scanf("%d", &N);
vector<int> v; v.resize(N + 1);
fill(v.begin(), v.end(), 100000);
vector<int> squares;
vector<int> tmp; tmp.resize(N + 1);
set<int> S;
for(int i = 1; i <= N; ++i) S.insert(i);
for(int i = 1; i * i <= N; ++i) {
v[i*i] = 1;
squares.push_back(i*i);
S.erase(i*i);
}
while(S.size() > 0) {
for(int i = 1; i <= N; ++i) {
for(auto& s: squares) {
if (i + s <= N) {
if (v[i + s] > v[i] + 1) {
v[i + s] = v[i] + 1;
S.erase(i + s);
}
} else {
break;
}
}
}
}
printf("%d\n", v[N]);
return 0;
}

μ΅œμ’… μ •λ‹΅ μ½”λ“œ

μœ„ μ½”λ“œκ°€ κΉ”λ”ν•˜μ§€ λͺ»ν•΄μ„œ set을 μ‚¬μš©ν•œ 뢀뢄을 μ–΄λ–»κ²Œ μ œκ±°ν• μ§€ κ³ λ―Όν•΄λ³΄λ‹ˆ μ μ ˆν•œ μ΄ˆκΈ°κ°’ μ„ΈνŒ…μœΌλ‘œ set을 없앨 수 μžˆμ—ˆλ‹€. μ΄ˆκΈ°κ°’μ€ 1=121 = 1^2μž„μ„ μ΄μš©ν•΄μ„œ μ„ΈνŒ…ν•œλ‹€. μ•„λž˜ μ½”λ“œκ°€ μ΅œμ’… 제좜 μ½”λ“œ.

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
int main() {
int N; scanf("%d", &N);
int dp[100001];
for(int i = 0; i <= N; ++i) dp[i] = i;
for(int i = 0; i <= N; ++i) {
for(int j = 2; j * j <= N; ++j) {
int s = j * j;
if (i + s <= N) {
if (dp[i + s] > dp[i] + 1) {
dp[i + s] = dp[i] + 1;
}
} else {
break;
}
}
}
printf("%d\n", dp[N]);
return 0;
}
🏷️ 주제 λͺ©λ‘: