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 |
Tags
- Backtracking
- 덩치
- 파이썬
- 다익스트라
- 정렬
- 코테
- 프로그래머스
- 동적계획법
- 코딩테스트
- 백트래킹
- 백준
- 통계학
- 동적
- 브루트포스
- 스택
- sort
- 월간 코드 챌린지 시즌2
- 퇴각검색
- 그리디
- 2중포문
- 소트
- 스프링프레임워크
- 스프링
- DFS
- 404에러
- 최단거리
- 최빈값
- 그리디알고리즘
- Python
- 소트인사이드
Archives
- Today
- Total
취준생의 코딩테스트 연습기
[백준] 제곱수의 합 / 파이썬(python) 본문
# 문제 링크
https://www.acmicpc.net/problem/1699
1699번: 제곱수의 합
어떤 자연수 N은 그보다 작거나 같은 제곱수들의 합으로 나타낼 수 있다. 예를 들어 11=32+12+12(3개 항)이다. 이런 표현방법은 여러 가지가 될 수 있는데, 11의 경우 11=22+22+12+12+12(5개 항)도 가능하다
www.acmicpc.net
# Soultion
처음에는 단순히 제곱근이 큰거부터 한개씩 제거했더니 문제가 발생하였다.12같은 경우는 9+1+1+1이므로 4개가 되는데, 실제로 최소값은 4+4+4이므로 모든 경우의 수를 확인해야하는 문제이다.
1
2
3
4
5
6
7
8
9
10
11
12
|
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])
|
cs |
3. 각 숫자들의 최소 제곱근을 저장하기위한 리스트이다. 각 숫자들은 1의 제곱근으로 만들 수 있으므로 자기자신으로 초기화
5. n까지 한개씩 계산하기
7. 제곱근의 값이 현재 값보다 커지면 멈추기(이 문장이 없으면 시간초과발생)
9. 새로구한 제곱근의 개수가 원래저장되어있는 개수보다 작으면 값을 새로업데이트해준다.
이때, 1을 더해주는 이유는 dp[i-j*j]에서 j*j라는 숫자를 더해준것이므로 1더하여 계산해준다.
'코딩테스트 > 백준' 카테고리의 다른 글
[백준] 1932 정수 삼각형 / 파이썬(python) (0) | 2021.06.14 |
---|---|
[백준] 1912 연속합 / 파이썬(python) (0) | 2021.06.04 |
[백준] 11724번 연결 요소의 개수 / 파이썬(python) (0) | 2021.05.25 |
[백준] 1654번 랜선 자르기 / 파이썬(python) (0) | 2021.05.25 |
[백준] 11053번 가장 긴 증가하는 부분 수열 / 파이썬(python) (0) | 2021.05.23 |