![[백준 C++] 17626 : Four Squares](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FAHU9w%2FbtsMyv1jyP6%2FG7x0K87iNkL2l5aNL78dP0%2Fimg.png)
[백준 C++] 17626 : Four SquaresCSE/코딩 문제풀이2025. 3. 3. 16:36
Table of Contents
https://www.acmicpc.net/problem/17626
DP와 브루트포스를 사용하는 문제이다.
모든 수는 제곱수로 표현되기 때문에 접근을 다음과 같이 진행하였다.
26일 경우는 1^2 + 25, 2^2 + 22 ...
그렇게 수를 계산하면 남은 숫자 25, 22 등등이 생기는데, 그것은 다시 DP[25], DP[22] 등을 다시 진행하면 된다.
모든 제곱수를 수를 확인하였을 때, 가장 적은 수를 계속 저장하면서 값을 확인하면 된다.
#include <iostream>
#include <vector>
#include <climits>
using namespace std;
int main()
{
vector<int> list;
int n;
cin >> n;
list = vector<int>(n + 1, -1);
for (int i = 1; i * i <= n; i++)
list[i * i] = 1;
for (int i = 1; i <= n; i++)
{
if (list[i] == -1)
{
int min = INT_MAX;
for (int j = 1; j * j <= i; j++)
{
int current = list[j * j] + list[i - (j * j)];
if (current < min)
min = current;
}
list[i] = min;
}
}
cout << list[n] << '\n';
return 0;
}
n을 입력받은 뒤, n보다 낮은 제곱수들은 미리 넣어주는 작업을 진행한다.
위에서 설명했던 접근방법을 진행한 후, 낮은 min값을 찾아 값을 저장한다.
'CSE > 코딩 문제풀이' 카테고리의 다른 글
[백준 C++] 18870 : 좌표 압축 (0) | 2025.03.15 |
---|---|
[백준 C++] 2805 : 나무 자르기 (0) | 2025.03.10 |
[백준 C++] 2630 : 색종이 만들기 (0) | 2025.02.25 |
[백준 C++] 11727 : 2×n 타일링 2 (0) | 2025.02.24 |
[백준 C++] 11726 : 2×n 타일링 (0) | 2025.02.23 |
@NiffJB :: 개발하는 니프
CSE & GAME 개발 블로그
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 부탁드립니다!