-
[Python][C++] 17626번 Four SquaresAlgorithm/Baekjoon 2024. 9. 11. 00:16
문제
https://www.acmicpc.net/problem/17626
코드
1. Python
import math n = int(input()) # 입력으로 숫자 n을 받음 dp = [0] * (n + 1) # DP 테이블 초기화 (0부터 n까지) dp[1] = 1 # 1은 제곱수 1로만 표현 가능하므로 dp[1] = 1 # 2부터 n까지 최소 제곱수의 합을 찾기 위한 반복문 for i in range(2, n + 1): min_value = 1e9 # 임의로 큰 값으로 초기화 (최솟값을 찾기 위해) # i보다 작은 제곱수들을 탐색하며 최소 값을 찾음 for j in range(1, int(math.sqrt(i)) + 1): min_value = min(min_value, dp[i - j ** 2]) # dp[i - j^2]의 최솟값을 갱신 dp[i] = min_value + 1 # i를 제곱수들의 합으로 표현한 최소 개수를 저장 # 결과 출력 (n을 제곱수의 합으로 표현한 최소 개수) print(dp[n])2. C++
#include <iostream> #include <vector> using namespace std; int main() { int n; cin >> n; vector<int> dp(n+1); for (int i = 1; i <= n; i++) { dp[i] = i; for (int j = 1; j * j <= i; j++) { dp[i] = min(dp[i], dp[i - j * j] + 1); } } cout << dp[n]; return 0; }풀이
- 제곱수 표현:
- 어떤 자연수 n을 네 개 이하의 제곱수 합으로 나타낼 수 있다. 즉, n = a^2 + b^2 + c^2 + d^2와 같이 표현할 수 있으며, 최소 몇 개의 제곱수로 표현할 수 있는지를 구하는 문제이다.
- 다이나믹 프로그래밍(DP) 사용:
- dp[i]를 숫자 ii를 최소 몇 개의 제곱수 합으로 표현할 수 있는지 저장하는 배열로 설정한다.
- 초기값으로 dp[0]=0을 설정하고, 이후 숫자 ii에 대해 1부터 ii까지의 제곱수를 확인하면서 최소 값을 갱신해 나간다.
- 점화식: dp[i]=min(dp[i],dp[i−j^2]+1)
- 최적화:
- 주어진 수 n에 대해 가능한 제곱수를 모두 탐색하면서, 각 숫자에 대해 제곱수의 합을 찾는다.
'Algorithm > Baekjoon' 카테고리의 다른 글
[Python][C++] 18870번 좌표 압축 (0) 2024.09.14 [Python][C++] 18111번 마인크래프트 (2) 2024.09.12 [Python][C++] 17219번 비밀번호 찾기 (0) 2024.09.10 [Python][C++] 16928번 뱀과 사다리 게임 (0) 2024.09.08 [Python][C++] 14940번 쉬운 최단거리 (0) 2024.09.07 - 제곱수 표현: