티스토리 뷰

알고리즘/백준

제곱수의 합 1699번 백준

글을 쓰는 개발자 2020. 12. 2. 20:39
반응형

문제:www.acmicpc.net/problem/1699

 

1699번: 제곱수의 합

어떤 자연수 N은 그보다 작거나 같은 제곱수들의 합으로 나타낼 수 있다. 예를 들어 11=32+12+12(3개 항)이다. 이런 표현방법은 여러 가지가 될 수 있는데, 11의 경우 11=22+22+12+12+12(5개 항)도 가능하다

www.acmicpc.net

이 문제는 c++로 제출했을 때는 통과했는데 python3로 제출했을 때는 시간초과가 난 문제이다. 또 이상하게 pypy3로 제출했을 때는 통과했다. 풀이법은 이제 제곱형태는 1로 저장하고 그 외의 다른 것은 1부터 루트값까지 반복문을 통하여 최소값을 찾은 다음에 저장하는 방식으로 하였다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import sys
N=int(sys.stdin.readline().rstrip())
dp = [100000]*100001
dp[1],dp[2],dp[3]=1,2,3
for i in range(4,N+1):
    if float(int(i**0.5))==i**0.5:
        dp[i]=1
    else:
        dp[i]=i
        for j in range(1,int(i**0.5)):
            dp[i]=min(dp[i],dp[j*j]+dp[i-j*j])
 
print(dp[N])
 
cs

풀이는 다음 위와 같다.

1
2
3
4
5
6
7
8
9
10
= int(input())
dp = [0]*(n+1)
for i in range(1, n+1):
    dp[i] = i
    j = 1
    while j*<= i:
        if dp[i] > dp[i-j*j]+1:
            dp[i] = dp[i-j*j]+1
        j += 1
print(dp[n])
cs

참고:br-brg.tistory.com/17

 

[Python]1699. 제곱수의 합

https://www.acmicpc.net/problem/1699 1699번: 제곱수의 합 어떤 자연수 N은 그보다 작거나 같은 제곱수들의 합으로 나타낼 수 있다. 예를 들어 11=32+12+12(3개 항)이다. 이런 표현방법은 여러 가지가 될 수 있.

br-brg.tistory.com

그래서 검색을 통해 무엇이 다른지 찾아보았다. 여기는 제곱수 판단을 i-j*j를 통해 해결하였다. 오로지 제곱수의 경우에만 dp[0]+1의 형태로 1의 값을 가지기 때문이다. 그리고 if문을 통해 현재 값보다 작은 값의 경우에만 정보가 수정이 가능하기에 잘못된 값이 덮어 쓰일 일은 없다. 크게 보면 비슷하지만 제곱수 판단과 min메소드와 if문의 차이에서 시간이 결정 된 것 같다.

 

반응형

'알고리즘 > 백준' 카테고리의 다른 글

가장 긴 증가하는 부분 수열 4 14002번 백준  (0) 2020.12.02
합분해 2225번 백준  (0) 2020.12.02
1,2,3 더하기 5 15990번 백준  (0) 2020.12.02
17299번 오등큰수  (0) 2020.12.01
17298번 오큰수  (0) 2020.12.01
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
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
글 보관함