[Python] 백준 #17626- Four Squares

2023. 9. 18. 17:24·코딩테스트/백준[Python]

문제


 

17626번: Four Squares

라그랑주는 1770년에 모든 자연수는 넷 혹은 그 이하의 제곱수의 합으로 표현할 수 있다고 증명하였다. 어떤 자연수는 복수의 방법으로 표현된다. 예를 들면, 26은 52과 12의 합이다; 또한 42 + 32 + 1

www.acmicpc.net

코드


My answer

import sys
input = sys.stdin.readline

n=int(input())
dp=[0]*(n+1)
array=[]

for i in range(int(n**0.5)+1):
    dp[i*i]=1
    
for i in range(1,n+1):
    for j in range(1,int(i**0.5)+1):
        if(dp[i]==0):dp[i]=dp[j*j]+dp[i-j*j]
        else:
            dp[i]=min(dp[i],dp[j*j]+dp[i-j*j])
    
print(dp[n])

Another answer

import math

n = int(input())
dp = [0] * (n + 1)
dp[0], dp[1] = 0, 1

for i in range(2, n + 1):
    if i == int(math.sqrt(i)) ** 2:
        dp[i] = 1
    else:
        dp[i] = i

for i in range(2, n + 1):
    for j in range(1, int(math.sqrt(i)) + 1):
        dp[i] = min(dp[i], dp[j * j] + dp[i - j * j])
print(dp[n])
L1=[x*x for x in range(1,224)]
L2=[i+j for i in L1 for j in L1 if i+j<50001];S2=set(L2)
L3=[i+j for i in L1 for j in S2 if i+j<50001];S3=set(L3)
N=int(input())
if N in L1:print(1)
elif N in S2:print(2)
elif N in S3:print(3)
else:print(4)
n = int(input())
L = set([i*i for i in range(1, 224)])
if n in L:
    print(1)
    exit()
for i in range(1, int(n**0.5)+1):
    if (n-i*i) in L:
        print(2)
        exit()
for i in range(1, int(n**(0.5)+1)):
    for j in range(1, int(n**0.5)+1):
        if (n-i*i-j*j) in L:
            print(3)
            exit()
print(4)

풀이


우선 이번 문제는 dp로 풀 경우 pypy3로 제출해야만 통과할 수 있는 것 같다. dp로 푼 분들 중 python3으로 해결한 사람을 찾지 못했다. 정 python3로 통과하고싶으면 브루트포스로 해결해야 했다.

우선 내 방법과 another answer 1이랑 똑같은 방법인데, 우선 제곱수의 경우 모두 1로 바꿔준다.(이것도 난 무식하게 구했는데, math.sqrt를 이용해서도 할 수 있는 것 같다.) 그리고 이제 dp[1]부터 반복문을 순회하면서 현재 i보다 작은 제곱수들로 만들 수 있는 모든 조합을 생각해봐야한다. 예를 들어 dp[6]=min(dp[1]+dp[5],dp[4]+dp[2]) 이런식으로. 왜냐하면 항상 가장 가까운 제곱수로 만든 것이 최소가 아니기 때문이다. 예를 들어 예시에 있는 11339의 경우는 105^2 + 15^2 + 8^2 + 5^2가 정답인데, 11339에 가장 가까운 제곱수는 106**2이기 때문이다. 따라서 모든 i보다 작은 제곱수들로 만들 수 있는 경우를 확인해봐야 했다. 

anothwer answer4가 브루트포스로 푼 가장 직관적인 방법인 것 같은데, 모든 수는 문제에서도 알 수 있듯이 최대 4개의 제곱수의 합으로 만들 수 있기 때문에, 1개의 제곱수로 만드는 경우, 2개의 제곱수로 만드는 경우, 3개의 제곱수로 만드는 경우를 확인하고 그 외는 모두 답이 4인 것을 활용한 브루트포스 해결 방법이었다.

728x90

'코딩테스트 > 백준[Python]' 카테고리의 다른 글

[Python] 백준 #1912- 연속합  (0) 2023.09.20
[Python] 백준 #11053- 가장 긴 증가하는 부분 수열  (0) 2023.09.18
[Python] 백준 #9655- 돌 게임  (0) 2023.09.18
[Python] 백준 #1010- 다리 놓기  (0) 2023.09.18
[Python] 백준 #10870- 피보나치 수 5  (0) 2023.09.18
'코딩테스트/백준[Python]' 카테고리의 다른 글
  • [Python] 백준 #1912- 연속합
  • [Python] 백준 #11053- 가장 긴 증가하는 부분 수열
  • [Python] 백준 #9655- 돌 게임
  • [Python] 백준 #1010- 다리 놓기
창빵맨
창빵맨
  • 창빵맨
    Let's be Developers
    창빵맨
    로그인/로그아웃
  • 전체
    오늘
    어제
    • 분류 전체보기 (471)
      • 알쓸신잡 (79)
      • ML & DL (85)
        • Computer v.. (22)
        • NLP (22)
        • 파이썬 머신러닝 완.. (3)
        • 개념정리 (38)
      • 리눅스 (21)
      • 프로젝트 (29)
        • 산불 발생 예측 (6)
        • 음성비서 (12)
        • pdf 병합 프로그.. (0)
        • 수위 예측 (5)
        • 가짜 뉴스 분류 (5)
        • 전력사용량 예측 (1)
      • 코딩테스트 (217)
        • 프로그래머스[Pyt.. (17)
        • 프로그래머스[Fai.. (3)
        • 백준[Python] (160)
        • 이것이취업을위한코딩.. (18)
        • 파이썬 알고리즘 (19)
      • 데이터분석실습 (25)
        • 데이터 과학 기반의.. (18)
        • 헬로 데이터 과학 (7)
      • 메모장 (0)
      • 잡담 (4)
  • Personal

    GITHUB
    Instagram
  • 공지사항

  • 인기 글

  • 태그

    나동빈
    dp
    파이썬
    백준
    그리디
    BFS
    이분탐색
    이것이취업을위한코딩테스트다
    이코테
    DFS
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3

HOME

HOME

상단으로

티스토리툴바