우규이인우윀
Eager To Learn 🌌
우규이인우윀
전체 방문자
였늘
μ–΄μ œ

λΈ”λ‘œκ·Έ 메뉴

  • 🏑 ν™ˆ
  • πŸš€ κΉƒν—ˆλΈŒ
  • β›… νƒœκ·Έ ν΄λΌμš°λ“œ
  • λΆ„λ₯˜ 전체보기 (217)
    • πŸ‘¨πŸ»‍πŸ’» PS (170)
      • JAVA (82)
      • MYSQL (1)
      • Docker (2)
      • PYTHON (24)
      • LeetCode 150 (39)
      • Algorithm 기법 (1)
      • 바킹독 (21)
    • λΈ”λ‘œκ·Έ 이사 (0)
    • Error (1)
    • CS (15)
      • DataBase (2)
      • OS (7)
      • Network (1)
      • Spring (1)
      • 자료ꡬ쑰 (3)
      • Java (1)
    • Learned (7)
      • Spring (7)
    • κ°œλ°œμ„œμ  (15)
      • 가상 λ©΄μ ‘ μ‚¬λ‘€λ‘œ λ°°μš°λŠ” λŒ€κ·œλͺ¨ μ‹œμŠ€ν…œ 섀계 기초 (1)
      • 였브젝트 - 쑰영호 (7)
      • μΉœμ ˆν•œ SQL νŠœλ‹ (7)
    • 회고 (2)
hELLO Β· Designed By μ •μƒμš°.
우규이인우윀

Eager To Learn 🌌

πŸ‘¨πŸ»‍πŸ’» PS/JAVA

[JAVA] λ°±μ€€ 1699번 γ€μ œκ³±μˆ˜μ˜ 합】

2022. 9. 26. 20:46


이 문제λ₯Ό μ²˜μŒμ—, λ‹¨μˆœν•˜κ²Œ νŠΉμ • μˆ«μžμ™€ κ°€μž₯ κ°€κΉŒμš΄ 제곱수λ₯Ό κ΅¬ν•˜κ³ , νŠΉμ • μˆ«μžμ™€ 제곱수의 차이에 ν•΄λ‹Ήν•˜λŠ” dp값을 λ”ν•˜λŠ” λ°©μ‹μœΌλ‘œ 접근을 ν–ˆμ—ˆλ‹€.

 

예λ₯Ό λ“€μ–΄, μ΄ˆκΈ°κ°’μœΌλ‘œ dp[1]= 1, dp[2]=2(1+1μ΄λ―€λ‘œ 2개) , dp[3]=3(1+1+1 μ΄λ―€λ‘œ 3개) λ₯Ό μ„€μ •ν•œ λ’€, 

 

λ§Œμ•½ 18이라면, 18κ³Ό κ°€μž₯ κ°€κΉŒμš΄ μ œκ³±μˆ˜λŠ” 16이기 λ•Œλ¬Έμ—, dp[18]=1(16μ΄λ―€λ‘œ 갯수 ν•˜λ‚˜ μ†Œμš”)+dp[2] 와 같은 λ°©μ‹μœΌλ‘œ 말이닀.

 

즉, 이와 같은 방식을 μ‚¬μš©ν•˜λ©΄ 18 = 4의 제곱 + 1의 제곱 + 1의제곱 = 총 갯수 3κ°œκ°€ λ‚˜μ˜€λŠ”λ°, 

 

사싀 18 = 3의제곱 + 3의제곱 = 2개 κ°€ 더 μ΅œμ†Œκ°―μˆ˜μ΄λ‹€.

 

κ·Έλž˜μ„œ, λ‹€λ₯Έ λ°©λ²•μœΌλ‘œ λ‹€μ‹œ μ ‘κ·Όν•΄μ•Ό ν–ˆλ‹€.

 

λ¨Όμ €, νŠΉμ • μˆ«μžμ—μ„œ 제곱수λ₯Ό μΆ”μΆœν•˜λŠ” 것은 ν•„μˆ˜μ μ΄λ‹€. ν•˜μ§€λ§Œ, 그게 무쑰건 κ°€μž₯ κ°€κΉŒμš΄ μ œκ³±μˆ˜κ°€ 아닐 수 μžˆλ‹€λŠ” 점이닀.

 

λ”°λΌμ„œ, νŠΉμ • μˆ«μžλ³΄λ‹€ μž‘μ€ λͺ¨λ“  제곱수λ₯Ό ν•˜λ‚˜μ”© λ„£μ–΄ λΉ„κ΅ν•΄λ³΄λŠ” 과정이 ν•„μš”ν•˜λ‹€.

 

dp[] μ—λŠ” ν•΄λ‹Ή 숫자의 μ΅œμ†Œ 제곱수 갯수λ₯Ό 기둝할 것이닀.

 

νŠΉμ • μˆ«μžμ—μ„œ 제곱수λ₯Ό λΉΌλŠ”(κ°μ‚°ν•˜λŠ”) 과정은 제곱수의 κ°―μˆ˜μ— +1 을 λ”ν•˜λŠ” κ³Όμ •κ³Ό κ°™λ‹€.

 

 


예λ₯Ό λ“€μ–΄, 17의 μ΅œμ†Œ 제곱수 갯수λ₯Ό κ΅¬ν•œλ‹€κ³  ν•˜λ©΄, λ°”ν…€μ—… 방식에 μ˜ν•΄ dp[16] κΉŒμ§€λŠ” λ‹€ μ±„μ›Œμ Έ μžˆλ‹€κ³  κ°€μ •ν•˜μž.

 

17 μ΄ν•˜μ˜ μ œκ³±μˆ˜λŠ” 1, 2, 3 ,4 이 μžˆλ‹€.

 

  1. 제곱수 4λ₯Ό λΊ„ λ•Œ,

    17 - 16 = 1 이고 17μ—μ„œ 16을 λΉΌλŠ” κ³Όμ •μ—μ„œ 4의 제곱이 λΆ„λ¦¬λ˜μ—ˆμœΌλ―€λ‘œ dp[17] = dp[1] + 1 이 λœλ‹€.

  2. 제곱수 3을 λΊ„ λ•Œ,

    17 - 9 = 8 이고, 17μ—μ„œ 9 λ₯Ό λΉΌλŠ” κ³Όμ •μ—μ„œ 3의 제곱이 λΆ„λ¦¬λ˜μ—ˆμœΌλ―€λ‘œ dp[17] = dp[8] +1 이 λœλ‹€.

  3.  μ œκ³±μˆ˜ 2λ₯Ό λΊ„ λ•Œ,

    17 - 4 = 13 이고, 17μ—μ„œ 4 λ₯Ό λΉΌλŠ” κ³Όμ •μ—μ„œ 2의 제곱이 λΆ„λ¦¬λ˜μ—ˆμœΌλ―€λ‘œ dp[17] = dp[13] + 1 이 λœλ‹€.

  4. 제곱수 1을 λΊ„ λ•Œ,

    17 - 1 = 16 이고, 17μ—μ„œ 1을 λΉΌλŠ” κ³Όμ •μ—μ„œ 1의 제곱이 λΆ„λ¦¬λ˜μ—ˆμœΌλ―€λ‘œ dp[17] = dp[16] + 1 이 λœλ‹€.

 

νŠΉμ • μˆ«μžλ³΄λ‹€ μž‘μ€ 제곱수λ₯Ό λΉΌκ³  남은 κ°’μ˜ dp값을 λ”ν•˜κ³ , 이듀 쀑 μ΅œμ†Ÿκ°’μ„ κΈ°λ‘ν•˜λ©΄ μ΅œμ†Œ 제곱 μˆ˜κ°€ 기둝이 λœλ‹€.

 

이 κ·œμΉ™μ„ dp[1] λΆ€ν„° dp[input] κ°’ κΉŒμ§€ μ μš©ν•œ λ’€ dp[input]값을 μΆ”μΆœν•˜λ©΄ 닡이 λ‚˜μ˜¨λ‹€!

 

import java.util.Arrays;
import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		int input = scanner.nextInt();
		int[] dp = new int[input + 1];
		for (int i = 1; i <= input; i++) {
			dp[i] = i;
			for (int j = 1; j * j <= i; j++) {
				dp[i] = Math.min(dp[i - j * j] + 1, dp[i]);
			}
		}
//		System.out.println(Arrays.toString(dp));
		System.out.println(dp[input]);
	}
}
    'πŸ‘¨πŸ»‍πŸ’» PS/JAVA' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€
    • [JAVA] λ°±μ€€ 9461번 γ€νŒŒλ„λ°˜ μˆ˜μ—΄γ€‘
    • [JAVA] λ°±μ€€ 2133번 【타일 μ±„μš°κΈ°γ€‘
    • [JAVA] λ°±μ€€ 2579번 【계단 였λ₯΄κΈ°γ€‘
    • [JAVA] λ°±μ€€ 1912번 【연속합】
    우규이인우윀
    우규이인우윀
    개발자 κΏˆλ‚˜λ¬΄

    ν‹°μŠ€ν† λ¦¬νˆ΄λ°”