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

졜근 λŒ“κΈ€

졜근 κΈ€

ν‹°μŠ€ν† λ¦¬

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

Frontend-Deep-Dive

[BOJ] λ°±μ€€ 9465 μŠ€ν‹°μ»€ / 동적 κ³„νšλ²•(Dynamic-Programming)
Problem_Solving

[BOJ] λ°±μ€€ 9465 μŠ€ν‹°μ»€ / 동적 κ³„νšλ²•(Dynamic-Programming)

2020. 3. 2. 18:12

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


 

πŸ’£ λ¬Έμ œ 이해

 

각 μŠ€ν‹°μ»€μ—λŠ” μ μˆ˜κ°€ λΆ€μ—¬λ˜μ–΄ 있으며, ν•œ μŠ€ν‹°μ»€λ₯Ό μ„ νƒν•˜λ©΄ κ·Έ μƒν•˜μ’Œμš°μ˜ μŠ€ν‹°μ»€λŠ” 선택할 수 μ—†λ‹€λŠ” 쑰건이 μ£Όμ–΄μ Έμžˆλ‹€.

2ν–‰ nμ—΄μ˜ μŠ€ν‹°μ»€ μ€‘μ—μ„œ 쑰건을 λ§Œμ‘±ν•˜λ©° μ„ νƒν–ˆμ„ λ•Œ, 얻을 수 μžˆλŠ” μ΅œλŒ€μ˜ 점수λ₯Ό κ΅¬ν•˜λŠ” λ¬Έμ œμ΄λ‹€.

 

ν•œ μŠ€ν‹°μ»€λ₯Ό 선택함에 따라 λ‹€μŒ 선택지가 결정될 κ²ƒλ§Œ κ°™μ•„ 그리디(Greedy algorithm) 방식일 것 κ°™μœΌλ‚˜,

κ·Έλ ‡κ²Œ ν•΄μ„œλŠ” μ§„μ§œ μ΅œλŒ€κ°’μ„ 찾을 μˆ˜κ°€ μ—†λ‹€.

 

λͺ¨λ“  κ°€λŠ₯ν•œ 선택지에 λŒ€ν•΄ 각각 ꡬ할 수 μžˆλŠ” μ΅œλŒ€κ°’μ„ μ°Ύμ•„μ•Όν•œλ‹€κ³  νŒλ‹¨ν–ˆλ‹€.

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

 

 

 

πŸ’­ 풀이 κ³Όμ •

 

첫 번째 ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€μ˜ κ²½μš°μ΄λ‹€.

 

 

<inpArr>

50 10 100 20 40
30 50 70 10 60

μΆœλ°œμ μ€ 50 λ˜λŠ” 30이닀.

 

50을 μ„ νƒν•˜λŠ” 경우, 우츑의 10κ³Ό μ•„λž˜μ˜ 30을 선택할 수 μ—†λ‹€.

κ·Έλ ‡λ‹€λ©΄ λ‹€μŒμœΌλ‘œ λŒ€κ°μ„  μ•„λž˜μ˜ 50, 70, 10, 60, .... 을 선택할 수 μžˆλ‹€. (30으둜 μ‹œμž‘ν•˜λŠ” κ²½μš°λŠ” 경우 λŒ€κ°μ„  μœ„λ₯Ό 체크)

 

κ·ΈλŸ¬λ‚˜, λŒ€κ°μ„  μ•„λž˜ 첫 λ²ˆμ§Έμ™€ 두 번째만 λΉ„κ΅ν•˜λ©΄ λœλ‹€.

λŒ€κ°μ„  μ•„λž˜ μ„Έ 번째인 10을 보면,

50 + 10 보닀 50 + 50 + 100 + 10이 훨씬 크기 λ•Œλ¬Έμ— μ œμ™Έν•΄λ„ λ˜λŠ” 것이닀.

 

이런 κ·œμΉ™μœΌλ‘œ dp 배열을 μ±„μš°λ©΄ μ•„λž˜μ™€ κ°™λ‹€.

 

 

 

<dpArr>

50 40 200 140 250
30 100 120 210 260

 

μ’ŒμΈ‘μ—μ„œ 우츑으둜 μ΄λ™ν•˜λ©΄μ„œ ν˜„μž¬ μŠ€ν‹°μ»€λ₯Ό κΈ°μ€€μœΌλ‘œ 얻을 수 μžˆλŠ” μ΅œλŒ€ μ μˆ˜κ°€ 기둝이 λœλ‹€.

이 μ˜ˆμ œμ—μ„œλŠ” 260이 μ΅œλŒ€μ μ΄ λœλ‹€.

 

 

 

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

 

#include <cstdio>
#include <algorithm>

int main(){
    int tcNum = 0, nNum = 0, answer = 0;
    int inpArr[2][100010] = {0,};
    int dpArr[2][100010] = {0,};
    
    scanf("%d", &tcNum);
    
    for (int temp = 0; temp < tcNum; ++temp) {
        scanf("%d", &nNum);
        //######## μž…λ ₯ 데이터 inpArr에 λ°›μ•„μ˜€κΈ° ########//
        for (int i = 0; i < 2; ++i) {
            for (int j = 0; j < nNum; ++j) {
                scanf("%d", &inpArr[i][j]);
            }
        }
        
        // 맨 쒌츑 0열은 κ·ΈλŒ€λ‘œ κ°€μ Έμ˜¨λ‹€.
        dpArr[0][0] = inpArr[0][0];
        dpArr[1][0] = inpArr[1][0];
        // 1열은 직접 μ±„μ›Œμ€€λ‹€.
        // (0행은 ν˜„μž¬μ™€ λŒ€κ°μ„  μ•„λž˜λ₯Ό ν•©, 1행은 ν˜„μž¬μ™€ λŒ€κ°μ„  μœ„λ₯Ό ν•©)
        dpArr[0][1] = inpArr[0][1] + inpArr[1][0];
        dpArr[1][1] = inpArr[1][1] + inpArr[0][0];
        
        for (int j = 2; j < nNum; ++j) {
            dpArr[0][j] = inpArr[0][j] + std::max(dpArr[1][j-2], dpArr[1][j-1]);
            dpArr[1][j] = inpArr[1][j] + std::max(dpArr[0][j-2], dpArr[0][j-1]);
            // μ—΄ 값을 μ±„μšΈ λ•Œλ§ˆλ‹€, κΈ°μ‘΄ μ΅œλŒ€κ°’λ³΄λ‹€ 큰 값을 찾으면 λŒ€μ²΄ν•œλ‹€.
            answer = answer < dpArr[0][j] ? dpArr[0][j] : answer;
            answer = answer < dpArr[1][j] ? dpArr[1][j] : answer;
        }
        
        printf("%d\n", answer);
        answer = 0;
    }
    
    return 0;
}

 

 

 

πŸ† 배운 점

 

처음 μ‹œλ„ν•  λ•Œ, 벑터λ₯Ό μ‚¬μš©ν•˜λ©΄μ„œ 2차원 배열을 μ„ μ–Έν•˜λ €κ³  ν•˜λ‹€λ³΄λ‹ˆ, ν•„μš” μ΄μƒμœΌλ‘œ μ†ŒμŠ€κ°€ κΈΈμ–΄μ§€λŠ” 뢀뢄듀이 μžˆμ—ˆλ‹€.

STL μ‚¬μš©μ— 더 μ΅μˆ™ν•΄μ§€λ €κ³  μΌλΆ€λŸ¬ μ‹œλ„ν•΄λ΄€λŠ”λ°, 일반 배열을 μ‚¬μš©ν•˜λŠ” 것이 훨씬 μƒμ‚°μ μ΄μ—ˆλ‹€.

 

μƒκ°ν•œ 풀이λ₯Ό μ†ŒμŠ€λ‘œ κ΅¬ν˜„ν•  λ•Œ, μ–΄λ–€ μžλ£Œν˜•μ„ μ“Έ 것인가도 ν˜„λͺ…ν•˜κ²Œ μ„ νƒν•΄μ•Όκ² λ‹€λŠ” 생각이 λ“€μ—ˆλ‹€.

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

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

[BOJ] λ°±μ€€ 2193 이친수 / 동적 κ³„νšλ²•(Dynamic-Programming)  (0) 2020.03.04
[BOJ] λ°±μ€€ 2294 동전 2 / 동적 κ³„νšλ²•(Dynamic-Programming)  (0) 2020.03.03
[BOJ] λ°±μ€€ 1463 1둜 λ§Œλ“€κΈ° / 동적 κ³„νšλ²•(Dynamic-Programming)  (0) 2020.02.27
[BOJ] λ°±μ€€ 1182 λΆ€λΆ„μˆ˜μ—΄μ˜ ν•© / μ™„μ „ 탐색(Brute-force Search)  (0) 2020.02.26
[BOJ] λ°±μ€€ 1018 체슀판 λ‹€μ‹œ μΉ ν•˜κΈ° / μ™„μ „ 탐색(Brute-force Search)  (0) 2020.02.25
    'Problem_Solving' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€
    • [BOJ] λ°±μ€€ 2193 이친수 / 동적 κ³„νšλ²•(Dynamic-Programming)
    • [BOJ] λ°±μ€€ 2294 동전 2 / 동적 κ³„νšλ²•(Dynamic-Programming)
    • [BOJ] λ°±μ€€ 1463 1둜 λ§Œλ“€κΈ° / 동적 κ³„νšλ²•(Dynamic-Programming)
    • [BOJ] λ°±μ€€ 1182 λΆ€λΆ„μˆ˜μ—΄μ˜ ν•© / μ™„μ „ 탐색(Brute-force Search)
    glowing713
    glowing713

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