YURIπŸ•πŸ“πŸΆ 2020. 9. 9. 10:56
λ°˜μ‘ν˜•

ATM (문제 _ 11399)

μΈν•˜μ€ν–‰μ—λŠ” ATM이 1λŒ€λ°–μ— μ—†λ‹€. μ§€κΈˆ 이 ATMμ•žμ— Nλͺ…μ˜ μ‚¬λžŒλ“€μ΄ 쀄을 μ„œμžˆλ‹€. μ‚¬λžŒμ€ 1λ²ˆλΆ€ν„° Nλ²ˆκΉŒμ§€ λ²ˆν˜Έκ°€ 맀겨져 있으며, i번 μ‚¬λžŒμ΄ λˆμ„ μΈμΆœν•˜λŠ”λ° κ±Έλ¦¬λŠ” μ‹œκ°„μ€ Pi뢄이닀.

μ‚¬λžŒλ“€μ΄ 쀄을 μ„œλŠ” μˆœμ„œμ— λ”°λΌμ„œ, λˆμ„ μΈμΆœν•˜λŠ”λ° ν•„μš”ν•œ μ‹œκ°„μ˜ 합이 λ‹¬λΌμ§€κ²Œ λœλ‹€. 예λ₯Ό λ“€μ–΄, 총 5λͺ…이 있고, P1 = 3, P2 = 1, P3 = 4, P4 = 3, P5 = 2 인 경우λ₯Ό μƒκ°ν•΄λ³΄μž. [1, 2, 3, 4, 5] μˆœμ„œλ‘œ 쀄을 μ„ λ‹€λ©΄, 1번 μ‚¬λžŒμ€ 3λΆ„λ§Œμ— λˆμ„ 뽑을 수 μžˆλ‹€. 2번 μ‚¬λžŒμ€ 1번 μ‚¬λžŒμ΄ λˆμ„ 뽑을 λ•Œ κΉŒμ§€ κΈ°λ‹€λ €μ•Ό ν•˜κΈ° λ•Œλ¬Έμ—, 3+1 = 4뢄이 걸리게 λœλ‹€. 3번 μ‚¬λžŒμ€ 1번, 2번 μ‚¬λžŒμ΄ λˆμ„ 뽑을 λ•ŒκΉŒμ§€ κΈ°λ‹€λ €μ•Ό ν•˜κΈ° λ•Œλ¬Έμ—, 총 3+1+4 = 8뢄이 ν•„μš”ν•˜κ²Œ λœλ‹€. 4번 μ‚¬λžŒμ€ 3+1+4+3 = 11λΆ„, 5번 μ‚¬λžŒμ€ 3+1+4+3+2 = 13뢄이 걸리게 λœλ‹€. 이 κ²½μš°μ— 각 μ‚¬λžŒμ΄ λˆμ„ μΈμΆœν•˜λŠ”λ° ν•„μš”ν•œ μ‹œκ°„μ˜ 합은 3+4+8+11+13 = 39뢄이 λœλ‹€.

쀄을 [2, 5, 1, 4, 3] μˆœμ„œλ‘œ 쀄을 μ„œλ©΄, 2번 μ‚¬λžŒμ€ 1λΆ„λ§Œμ—, 5번 μ‚¬λžŒμ€ 1+2 = 3λΆ„, 1번 μ‚¬λžŒμ€ 1+2+3 = 6λΆ„, 4번 μ‚¬λžŒμ€ 1+2+3+3 = 9λΆ„, 3번 μ‚¬λžŒμ€ 1+2+3+3+4 = 13뢄이 걸리게 λœλ‹€. 각 μ‚¬λžŒμ΄ λˆμ„ μΈμΆœν•˜λŠ”λ° ν•„μš”ν•œ μ‹œκ°„μ˜ 합은 1+3+6+9+13 = 32뢄이닀. 이 방법보닀 더 ν•„μš”ν•œ μ‹œκ°„μ˜ 합을 μ΅œμ†Œλ‘œ λ§Œλ“€ μˆ˜λŠ” μ—†λ‹€.

쀄을 μ„œ μžˆλŠ” μ‚¬λžŒμ˜ 수 Nκ³Ό 각 μ‚¬λžŒμ΄ λˆμ„ μΈμΆœν•˜λŠ”λ° κ±Έλ¦¬λŠ” μ‹œκ°„ Piκ°€ μ£Όμ–΄μ‘Œμ„ λ•Œ, 각 μ‚¬λžŒμ΄ λˆμ„ μΈμΆœν•˜λŠ”λ° ν•„μš”ν•œ μ‹œκ°„μ˜ ν•©μ˜ μ΅œμ†Ÿκ°’μ„ κ΅¬ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€.

μž…λ ₯
첫째 쀄에 μ‚¬λžŒμ˜ 수 N(1 ≀ N ≀ 1,000)이 μ£Όμ–΄μ§„λ‹€. λ‘˜μ§Έ μ€„μ—λŠ” 각 μ‚¬λžŒμ΄ λˆμ„ μΈμΆœν•˜λŠ”λ° κ±Έλ¦¬λŠ” μ‹œκ°„ Piκ°€ μ£Όμ–΄μ§„λ‹€. (1 ≀ Pi ≀ 1,000)

좜λ ₯
첫째 쀄에 각 μ‚¬λžŒμ΄ λˆμ„ μΈμΆœν•˜λŠ”λ° ν•„μš”ν•œ μ‹œκ°„μ˜ ν•©μ˜ μ΅œμ†Ÿκ°’μ„ 좜λ ₯ν•œλ‹€.

예제

5
3 1 4 3 2    
answer : 32

풀이

각 μ‚¬λžŒμ΄ λˆμ„ μΈμΆœν•˜λŠ”λ° ν•„μš”ν•œ μ‹œκ°„μ€ μ•ž μ‚¬λžŒμ—μ„œ κ±Έλ¦° μ‹œκ°„ + μžμ‹ μ΄ μΈμΆœν•˜λŠ”λ° ν•„μš”ν•œ μ‹œκ°„μ΄λ‹€.
κ·ΈλŸ¬λ―€λ‘œ μ˜€λ¦„μ°¨μˆœμœΌλ‘œ μ •λ ¬ν•˜μ—¬ μΈμΆœν•˜λŠ” μ‹œκ°„μ΄ 적게 κ±Έλ¦¬λŠ” μ‚¬λžŒμ΄ λ¨Όμ € μΈμΆœν•΄μ•Ό ν•œλ‹€.

P1 = 3, P2 = 1, P3 = 4, P4 = 3, P5 = 2 인 경우λ₯Ό μƒκ°ν•΄λ³΄μž. [1, 2, 3, 4, 5] μˆœμ„œλ‘œ 쀄을 μ„ λ‹€λ©΄

P1 = 3

P2 = P1 + 1 = (3) + 1 = 4

P3 = P1 + P2 + 4 = (3 + 1) + 4 = 8 

...

P5 = P1 + P2 + P3 + P4 + 2 = (3 + 1 + 4 + 3) + 2 = 13

μ΄λŸ°μ‹μœΌλ‘œ μ‹œκ°„μ΄ κ³„μ‚°λ˜κ²Œ λœλ‹€.

계산 과정을 보면 μ•žμ˜ μ‚¬λžŒμ˜ κ°’κ³Ό ν˜„μž¬ λ‚΄κ°€ κ±Έλ¦¬λŠ” μ‹œκ°„μ˜ 값이 더해져 인좜 μ‹œκ°„μ΄ κ²°μ •λ‚œλ‹€λŠ” 사싀을 μ•Œ 수 μžˆλ‹€. κ·Έλ ‡κΈ° λ•Œλ¬Έμ— μ•žμ˜ μ‚¬λžŒμ΄ κ±Έλ¦¬λŠ” μ‹œκ°„μ΄ μž‘μ€κ²Œ μ€‘μš”ν•˜λ‹€.

κ·Έλ ‡κΈ° λ•Œλ¬Έμ— sort ν•¨μˆ˜λ₯Ό μ΄μš©ν•΄ μ˜€λ¦„μ°¨μˆœμœΌλ‘œ μ •λ ¬ν–ˆκ³ , μ•ž μ‚¬λžŒμ΄ 값을 μ €μž₯ν•˜κΈ° μœ„ν•΄ dp 배열을 μ‚¬μš©ν•΄ μ €μž₯ν–ˆλ‹€.

μ½”λ“œ

vector<int> datas;
int dp[1001];

int main(){
    int n , tmp;
    cin >> n;

    for(int i=0;i<n;i++) {
        cin >> tmp;
        datas.push_back(tmp);
    }

    sort(datas.begin(), datas.end()); // κ°€μž₯ μž‘μ€ 순으둜 더해야 함

    dp[0]= datas[0];
    int sum = dp[0];

    for(int i=1;i<n;i++){
        dp[i] = dp[i-1] + datas[i]; // i-1κΉŒμ§€ κ±Έλ¦° μ‹œκ°„ + iκ°€ κ±Έλ¦¬λŠ” μ‹œκ°„
        sum += dp[i]; // μ΅œμ’… μ‹œκ°„μ€ κ±Έλ¦° μ‹œκ°„λ“€μ˜ ν•©
    }

    cout << sum;
}
λ°˜μ‘ν˜•