Pepperminttt
Pepperminttt's Dev
Pepperminttt
전체 방문자
오늘
어제
  • devInfo (86)
    • forBeingGoodDeveloper (2)
    • React (2)
      • LostArk Open API (1)
    • algorithm (58)
      • problems (44)
      • theory (14)
    • computerScience (8)
      • network (8)
    • javaScript (8)
    • Java (4)
    • web (2)
      • webApplication (2)
    • etc. (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • solved.ac
  • 프로그래머스
  • 알고리즘
  • node.js
  • DP문제
  • 백준
  • DP
  • greedy
  • 그래프
  • C++
  • BFS
  • Java
  • 벨만-포드
  • 탐욕법 문제
  • bfs문제
  • JavaScript
  • dfs문제
  • 탐욕법
  • dfs
  • Network

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
Pepperminttt

Pepperminttt's Dev

[백준 / Java] 17626번 Four Squares
algorithm/problems

[백준 / Java] 17626번 Four Squares

2023. 7. 23. 10:00

 

문제

라그랑주는 1770년에 모든 자연수는 넷 혹은 그 이하의 제곱수의 합으로 표현할 수 있다고 증명하였다. 어떤 자연수는 복수의 방법으로 표현된다. 예를 들면, 26은 52과 12의 합이다; 또한 42 + 32 + 12으로 표현할 수도 있다. 역사적으로 암산의 명수들에게 공통적으로 주어지는 문제가 바로 자연수를 넷 혹은 그 이하의 제곱수 합으로 나타내라는 것이었다. 1900년대 초반에 한 암산가가 15663 = 1252 + 62 + 12 + 12라는 해를 구하는데 8초가 걸렸다는 보고가 있다. 좀 더 어려운 문제에 대해서는 56초가 걸렸다: 11339 = 1052 + 152 + 82 + 52.

자연수 n이 주어질 때, n을 최소 개수의 제곱수 합으로 표현하는 컴퓨터 프로그램을 작성하시오.

입력

입력은 표준입력을 사용한다. 입력은 자연수 n을 포함하는 한 줄로 구성된다. 여기서, 1 ≤ n ≤ 50,000이다.

출력

출력은 표준출력을 사용한다. 합이 n과 같게 되는 제곱수들의 최소 개수를 한 줄에 출력한다.

예제 입력 1 복사

25

예제 출력 1 복사

1

예제 입력 2 복사

26

예제 출력 2 복사

2

예제 입력 3 복사

11339

예제 출력 3 복사

3

예제 입력 4 복사

34567

예제 출력 4 복사

4

 

문제 출처 : https://www.acmicpc.net/problem/17626


문제 풀이

 해당 문제는 동적 프로그래밍을 이용하면 간단하게 풀 수 있다.  넷 혹은 그 이하의 제곱수의 합으로 숫자를 나타내기 위해서는 (해당 숫자 - 자신보다 작거나 같은 제곱수) 중 가장 작은 횟수를 사용하는 합에 제곱수를 더하면 만들 수 있다.

 

위의 방법으로 6을 제곱수의 합으로 나타내 보자.

 

1. (자신보다 작거나 같은 제곱수)의 경우를 구한다

 자신보다 작거나 같은 제곱수는 1, 4이다.

 

2. (값 - 위에서 구한 값)의 수 중 가장 작은 것을 구한다.

dp[6 - 1] => 2^2 + 1^2 + 1^1 로 3

dp[6 - 4] => 1^2 + 1^2 로 2

 

두 경우 중 작은 경우는 dp[6-4]로 dp[2] = 2이다.

 

3. 위 경우를 가지고 dp[6]을 구한다.

dp[6] = dp[2] + 4 = 1^2 +1^2 + 2^2 = 3이다.

 

 

위와 같은 경우로 최소값을 구해나가면 원하는 값을 구할 수 있다.


정답 코드

import java.io.*;
import java.util.*;
 
public class Main {
 
	public static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
	public static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
	public static int[] dp = new int[50001];
	public static int[] dp2;
	public static void main(String[] args) throws IOException {
		StringTokenizer st = new StringTokenizer(br.readLine()," ");
		
		int num = Integer.parseInt(st.nextToken());
		
		dp[1] = 1;
		
		for(int i = 2; i <= num; i++) {
			int min = Integer.MAX_VALUE;
			 for (int j = 1; j * j <= i; j++) {
	                int temp = i - j * j;
	                min = Math.min(min, dp[temp]);
	            }
			dp[i] = min + 1;
		}
		System.out.println(dp[num]);
		bw.flush();
		bw.close();
	}
}

 

 

 

'algorithm > problems' 카테고리의 다른 글

[백준 / Java] 1865번 : 웜홀  (0) 2023.07.27
[백준 / Java] 1504번 : 특정한 최단 경로  (0) 2023.07.24
[프로그래머스 / Javascript] 당구 연습  (1) 2023.06.16
[프로그래머스 / Javascript] 전력망을 둘로 나누기  (0) 2023.06.01
[프로그래머스 / C++] 이모티콘 할인행사  (0) 2023.05.19
    'algorithm/problems' 카테고리의 다른 글
    • [백준 / Java] 1865번 : 웜홀
    • [백준 / Java] 1504번 : 특정한 최단 경로
    • [프로그래머스 / Javascript] 당구 연습
    • [프로그래머스 / Javascript] 전력망을 둘로 나누기
    Pepperminttt
    Pepperminttt
    HTML, JavaScript, Python 등 Computer language TIL

    티스토리툴바