glowing713
Frontend-Deep-Dive
glowing713
전체 방문자
였늘
μ–΄μ œ
  • λΆ„λ₯˜ 전체보기 (97)
    • Languages (11)
      • JavaScript πŸ’› (3)
      • Python 🐍 (4)
      • Java β˜•οΈ (3)
      • Swift 🧑 (1)
    • Computer_Science (1)
      • Computer_Network πŸ•Έ (1)
    • Web_Frontend (4)
      • Vue.js (1)
    • Problem_Solving (76)
    • Server (1)
      • Spring πŸ€ (1)
    • AI (2)
      • NLP πŸ—£ (1)
      • AI_Math βž— (1)
    • κ°œλ°œν™˜κ²½ κΎΈλ―ΈκΈ° ✌ (1)
    • 생각정리 ✍🏻 (1)

λΈ”λ‘œκ·Έ 메뉴

  • πŸ§‘πŸ»β€πŸ’»Github

곡지사항

인기 κΈ€

νƒœκ·Έ

  • Java
  • 2019 카카였 개발자 겨울 인턴십
  • Algorithm
  • λ™μ κ³„νšλ²•
  • Baekjoon
  • Python
  • Stack
  • DP
  • mst
  • BOJ
  • brute-force
  • bfs
  • boostcampaitech
  • c++
  • 카카였 기좜
  • 완전탐색
  • 이뢄탐색
  • binary search
  • ps
  • ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€

졜근 λŒ“κΈ€

졜근 κΈ€

ν‹°μŠ€ν† λ¦¬

hELLO Β· Designed By μ •μƒμš°.
glowing713

Frontend-Deep-Dive

[BOJ] λ°±μ€€ 1699 제곱수의 ν•© / 동적 κ³„νšλ²•(Dynamic-Programming)
Problem_Solving

[BOJ] λ°±μ€€ 1699 제곱수의 ν•© / 동적 κ³„νšλ²•(Dynamic-Programming)

2020. 3. 4. 23:33

이미지λ₯Ό ν΄λ¦­ν•˜λ©΄ 문제 μ‚¬μ΄νŠΈλ‘œ μ΄λ™ν•©λ‹ˆλ‹€.


 

 

πŸ’£ λ¬Έμ œ 이해

 

 

1. μ–΄λ–€ μžμ—°μˆ˜ N 은 그보닀 μž‘κ±°λ‚˜ 같은 μ œκ³±μˆ˜λ“€μ˜ ν•©μœΌλ‘œ λ‚˜νƒ€λ‚Ό 수 μžˆλ‹€.

2. μ£Όμ–΄μ§„ μžμ—°μˆ˜ N을 μ΄λ ‡κ²Œ μ œκ³±μˆ˜λ“€μ˜ ν•©μœΌλ‘œ ν‘œν˜„ν•  λ•Œμ— κ·Έ ν•­μ˜ μ΅œμ†Œκ°œμˆ˜λ₯Ό ꡬ해야 ν•œλ‹€.

 

동적 κ³„νšλ²•(Dynamic Programming) 방식을 μ‚¬μš©ν–ˆλ‹€.

 

 

 

 

πŸ’­ 풀이 κ³Όμ •

 

 

DP 방식을 ν™œμš©ν•˜κΈ°λ‘œ ν•˜λ©΄μ„œ μ œκ³±μˆ˜κ°€ 1 둜만 κ΅¬μ„±λ˜μ–΄μžˆμ„ λ•Œ, 1, 2 둜 κ΅¬μ„±λ˜μ–΄ μžˆμ„ λ•Œ, 1, 2, 3 으둜 κ΅¬μ„±λ˜μ–΄ μžˆμ„ λ•Œ .... λ“±λ“±

 

순차적으둜 ν•˜λ‚˜ μ”© ν¬ν•¨ν•˜λ©° λͺ¨λ“  경우λ₯Ό λ”°μ Έλ³΄κΈ°λ‘œ ν–ˆλ‹€.

 

N 이 15 인 경우λ₯Ό 예둜 λ“€μ–΄λ³΄μžλ©΄ λ‹€μŒκ³Ό κ°™λ‹€.

 

 

 

 

< 1 의 μ œκ³±μˆ˜λ“€μ˜ ν•©μœΌλ‘œ λ§Œλ“€ λ•Œ ν•­μ˜ 수 >

 

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

 

각 μΈλ±μŠ€κ°€ μž…λ ₯으둜 λ°›λŠ” μžμ—°μˆ˜ N 이닀.

N = 5 의 경우  12 + 12 + 12 + 12 + 12 = 5  μ΄λ―€λ‘œ λ‹€μ„― 개의 항을 κ°€μ§€κ³  μžˆλ‹€.

 

 

그런데 λ‹€λ₯Έ DP λ¬Έμ œμ—μ„œλ„ 많이 μ μš©ν•  수 μžˆλŠ” κΈ°λ²•μ΄μ§€λ§Œ, 이런 생각을 ν•  수 μžˆλ‹€.

ν˜„μž¬ 1의 제곱수만 λ”°μ Έλ³΄λŠ” 경우 N = 5 μΌ€μ΄μŠ€λŠ” , 12 을 ν¬ν•¨ν•œλ‹€λ©΄ N = 4 μΌ€μ΄μŠ€μ— 항을 ν•˜λ‚˜λ§Œ 더 μΆ”κ°€ν•˜λŠ” 것이닀.

 

μ ν™”μ‹μœΌλ‘œ ν‘œν˜„ν•˜μžλ©΄ dp[ν˜„μž¬μˆ«μž] = 1 + dp[ν˜„μž¬μˆ«μž - (1 * 1)] 둜 λ‚˜νƒ€λ‚Ό 수 μžˆλŠ” 것이닀.

 

 

 

< 1, 2 의 μ œκ³±μˆ˜λ“€μ˜ ν•©μœΌλ‘œ λ§Œλ“€ λ•Œ ν•­μ˜ 수 >

 

0 1 2 3

4

1

5

2

6

3

7

4

8

2

9

3

10

4

11

5

12

3

13

4

14

5

15

6

 

μ΄λ²ˆμ—λŠ” 2 도 ν¬ν•¨ν•˜λŠ” κ²½μš°μ΄λ‹€.

 

2 의 제곱인 4 λΆ€ν„° μ‹œμž‘ν•œλ‹€. 더 μž‘μ€ 수인 1, 2, 3 은 μ–΄μ°¨ν”Ό 2의 제곱으둜 ν‘œν˜„ν•  수 μ—†κΈ° λ•Œλ¬Έμ΄λ‹€.

4 μ—μ„œ 22 λ₯Ό ν•˜λ‚˜ ν¬ν•¨ν•˜λ©΄ 남은 μˆ˜λŠ” 0 이 λœλ‹€. (4 - 2 * 2) 0 을 ν‘œν˜„ν•  수 μžˆλŠ” 제곱수의 ν•­ (dp[0]) 은 0 개 μ΄λ―€λ‘œ 여기에 1 을 λ”ν•œ 1 이 1, 2 의 μ œκ³±μˆ˜λ“€μ˜ ν•©μœΌλ‘œ λ§Œλ“œλŠ” ν•­μ˜ μˆ˜μ΄λ‹€.

기쑴에 1 둜만 κ΅¬μ„±ν•˜μ—¬ λ§Œλ“  μΌ€μ΄μŠ€ (12 + 12 + 12 + 12) 4κ°€μ§€ 보닀 더 적은 ν•­ (22) 1κ°€μ§€ 둜 λ§Œλ“€ 수 μžˆμœΌλ―€λ‘œ λŒ€μ²΄ν•œλ‹€.

 

μ‹μœΌλ‘œ μ •λ¦¬ν•˜μžλ©΄ 

 

dp[j] = min(dp[j] , dp[j - i * i]) 이 λœλ‹€.

 

i κ°€ 제곱수이고, j λŠ” λ§Œλ“€κ³ μž ν•˜λŠ” 수 κ°€ λœλ‹€.

 

 

 

μž‘μ„± μ–Έμ–΄: C++

 

#include <cstdio>   // c ν‘œμ€€μž…μΆœλ ₯
#include <algorithm> // std::min ν•¨μˆ˜
#include <limits.h> // INT_MAX μƒμˆ˜ (int의 μ΅œλŒ€λ²”μœ„)

int dp[100010] = {0, };

void solve(){
    dp[0] = 0;
    for (int i = 1; i * i <= 100000; ++i) {
        for (int j = i * i; j <= 100000; ++j) {
            int remain = j - i * i; // 제곱수λ₯Ό ν•˜λ‚˜ ν¬ν•¨ν–ˆμ„ λ•Œ λ‚˜λ¨Έμ§€
            dp[j] = std::min(dp[j], 1 + dp[remain]);
        }
    }
}

int main(){
    int nNumber;
    std::fill_n(dp, sizeof(dp)/sizeof(int), INT_MAX);  // dp 배열을 큰 κ°’μœΌλ‘œ μ΄ˆκΈ°ν™”
    scanf("%d", &nNumber);
    solve();
    printf("%d\n", dp[nNumber]);
    return 0;
}

 

 

 

 

πŸ† 배운 점

 

 

이전에 ν’€λ©° μ μš©ν–ˆλ˜ 풀이방법듀이 λ– μ˜€λ₯΄λ©° 금방 μ μš©ν•˜κ²Œ 된 λ¬Έμ œμ˜€λ‹€.

 

많이 ν’€μ–΄λ³΄λŠ” 것이 μ‹€λ ₯ ν–₯상에 큰 도움이 λ˜κ² λ‹€λŠ” 생각이 λ“ λ‹€.

μ €μž‘μžν‘œμ‹œ λΉ„μ˜λ¦¬ λ³€κ²½κΈˆμ§€ (μƒˆμ°½μ—΄λ¦Ό)

'Problem_Solving' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

μ™œ 정닡을 λ‚˜λˆˆ λ‚˜λ¨Έμ§€λ₯Ό 좜λ ₯ν•˜λΌκ³  ν• κΉŒ? - λ‚˜λ¨Έμ§€ μ—°μ‚°  (0) 2020.03.06
[BOJ] λ°±μ€€ 10844 μ‰¬μš΄ 계단 수 / 동적 κ³„νšλ²•(Dynamic-Programming)  (0) 2020.03.06
[BOJ] λ°±μ€€ 11726 2xn 타일링 / 동적 κ³„νšλ²•(Dynamic-Programming)  (0) 2020.03.04
[BOJ] λ°±μ€€ 1904 01타일 / 동적 κ³„νšλ²•(Dynamic-Programming)  (0) 2020.03.04
[BOJ] λ°±μ€€ 2193 이친수 / 동적 κ³„νšλ²•(Dynamic-Programming)  (0) 2020.03.04
    'Problem_Solving' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€
    • μ™œ 정닡을 λ‚˜λˆˆ λ‚˜λ¨Έμ§€λ₯Ό 좜λ ₯ν•˜λΌκ³  ν• κΉŒ? - λ‚˜λ¨Έμ§€ μ—°μ‚°
    • [BOJ] λ°±μ€€ 10844 μ‰¬μš΄ 계단 수 / 동적 κ³„νšλ²•(Dynamic-Programming)
    • [BOJ] λ°±μ€€ 11726 2xn 타일링 / 동적 κ³„νšλ²•(Dynamic-Programming)
    • [BOJ] λ°±μ€€ 1904 01타일 / 동적 κ³„νšλ²•(Dynamic-Programming)
    glowing713
    glowing713

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