Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | 31 |
Tags
- 프로젝트
- 그리디
- parklab
- 시각화
- 멋쟁이사자처럼
- GNN
- DFS
- likelion
- intern10
- ux·ui디자인
- Rag
- 멋사
- likelionlikelion
- 마이온
- DP
- graphrag
- kgc
- 멋재이사자처럼
- Python
- 인턴10
- TiL
- seaborn
- paper review
- SQL
- folium
- 알고리즘
- 마이온컴퍼니
- 파이썬
- Join
- tog
Archives
- Today
- Total
지금은마라톤중
[백준] 1699번 제곱수의 합 본문
제곱수의 합들을 구해보면 다음과 같습니다.
1 : 1
2: 1 + 1
3: 1 + 1 + 1
4: 4
5: 4 + 1
6: 4 + 1 + 1
7: 4 + 1 + 1 + 1
8: 4 + 4
9 : 9
10: 9 + 1
11: 9 + 1 + 1
12: 4 + 4 + 4
시도 : 실패
- 재귀함수 사용
- N보다 작거나 같은 제곱수를 빼면서 카운팅
- 반례 존재 : 12( 9+1+1+1)로 나오지만 최소개수는 3개(4+4+4)
- 시도방법은 최소개수가 아닌 단순히 제곱수들의 합으로 나타내기만 한 것
import sys
sys.setrecursionlimit(100000)
def cal_func(n, cnt):
num = int(n**0.5)
rest = n - (num**2)
cnt +=1
if rest == 0 :
print(cnt)
else :
cal_func(rest,cnt)
n = int(input())
cal_func(n,0)
올바른 접근법
- DP 활용
- 결과의 규칙성을 활용
- 제곱수일때는 dp[i] = 1
- 나머지는 dp[i] = dp[i-j*j] +1
- ex) 12일때 min(dp[12 -1], dp[12-4], dp[12-9]) + 1
n = int(input())
dp = [i for i in range(n+1)]
for i in range(1,n+1):
for j in range(1,i):
if (j*j)> i:
break
if dp[i] > dp[i-j*j]+1 :
dp[i] = dp[i-j*j]+1
print(dp[n])
규칙성이 눈이 보이는 것 같은데 DP로 구현하는게 어렵습니다..ㅜㅜ
많이 풀어보는게 정답인듯!!!
'STUDY > Python 알고리즘' 카테고리의 다른 글
[백준] 1912번 연속합 (0) | 2024.05.16 |
---|---|
[백준] 11726번 2xn 타일링 (0) | 2024.05.15 |
[백준] 10844번 쉬운 계단 수 (0) | 2024.05.02 |
[백준] 2193번 이친수 (0) | 2024.05.01 |
[백준]1463번 1로 만들기 (3) | 2024.05.01 |
Comments