https://www.acmicpc.net/problem/1699
고민:
입력한 수를 num이라 하자
sqrt(num)값이 가장 큰 제곱수일 것이다
그 수를 제외한 나머지의 sqrt()값이 가장 크다
계속 반복해서 1일 때까지 개수를 세본다
또, cnt 변수도 쓰겠다
## 오답
# 입력, 기본 설정
import math
num = int(input())
cnt = 0
tot = num
# 제곱수 항의 최소 개수 구하기
while(tot!=0):
#print(tot) #
sqrtNum = int(math.sqrt(tot))
tot -= sqrtNum * sqrtNum
cnt += 1
# 출력
print(cnt)
반례 -> 18 = 3^2+ 3^2 = 4^2 + 1^2 + 1^2
최소항의 개수는 2인데 3으로 나옴
내가 처음 생각한 답은 단순하게 제곱하는 수가 크면 좋은 건줄 알았다(그리디 알고리즘)
<동적 계획법, Dynamic Programming>
모든 방법을 일일이 검토하여 최적의 해를 찾아내는 방식의 알고리즘
그리디 알고리즘에 비해 시간이 오래 걸리지만, 항상 최적의 해를 구할 수 있다.
교훈:
1. while(조건문) 실수 주의
여기 안에는 특정 경우의 반대로 써야함
tot==0 까지 반복한다 -> tot !=0
2. ??
https://chanhuiseok.github.io/posts/baek-10/
설명을 봐도 이해가 잘 안감
'Python > 알고리즘' 카테고리의 다른 글
[프로그래머스] 60057 문자열 압축 (0) | 2022.07.10 |
---|---|
[백준] 11478 / 18247 (0) | 2022.07.06 |
[백준] 1225 이상한 곱셈 (0) | 2022.07.06 |
[백준] 5639 이진 검색 트리 (미완) (0) | 2022.07.03 |
[파이썬] 16503 괄호 없는 사칙연산 (0) | 2022.07.02 |