✨ Algorithm

[λ°±μ€€/C++] 11399번: ATM

nitronium102 2022. 7. 1. 23:53
 

문제

μΈν•˜μ€ν–‰μ—λŠ” 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)

좜λ ₯

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

 

풀이

각 μ‚¬λžŒμ΄ λˆμ„ μΈμΆœν•˜λŠ”λ° κ±Έλ¦¬λŠ” μ‹œκ°„μ΄ 적은 μˆœμ„œλŒ€λ‘œ 계산해주면 λœλ‹€. 

λ¬Έμ œλŠ” 돈 μΈμΆœν•˜λŠ” μ‹œκ°„μ˜ 합인데 두 가지 방법이 μžˆλ‹€. 

1. μ‹œκ°„λ³΅μž‘λ„ O(n^2) : λˆ„κ΅¬λ‚˜ 생각할 수 μžˆλŠ” 방법. 

2. μ‹œκ°„λ³΅μž‘λ„ O(n) : 각 μ‹œκ°„μ΄ λ‚˜μ˜€λŠ” λΉˆλ„λ₯Ό κ³„μ‚°ν•˜λ©΄ λœλ‹€.

ex) time : 1 2 3 4 5 라고 ν•˜λ©΄

첫 번째 μ‚¬λžŒ : 1

두 번째 μ‚¬λžŒ : 1 + 2

μ„Έ 번째 μ‚¬λžŒ : 1 + 2 + 3

λ„€ 번째 μ‚¬λžŒ : 1 + 2 + 3 + 4

λ‹€μ„―λ²ˆμ§Έ μ‚¬λžŒ : 1 + 2 + 3 + 4 + 5

-> 1λΆ„ * 5번 + 2λΆ„ * 4번 + 3λΆ„ * 3번 + 4λΆ„ * 2번 + 5λΆ„ * 1번

-> μˆ˜μ‹μœΌλ‘œ λ‚˜νƒ€λ‚΄λ©΄ time[i] * (n-i)

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int main(){
    int n;

    // μž…λ ₯
    cin >> n;
    vector<int> time(n, 0);
    for (int i=0; i<n; i++)
        cin >> time[i];

    // μ—°μ‚°
    sort(time.begin(), time.end());

    // 좜λ ₯ (1)
    int result = 0, sum;
    for (int i=0; i<n; i++){
        sum = 0;
        for (int j=0; j<=i; j++)
            sum += time[j];
        result += sum;
    }

    // 좜λ ₯ (2) : μ‹œκ°„λ³΅μž‘λ„ κ°œμ„ 
    // (n-i)을 λΉˆλ„λ‘œ 생각
    int result = 0;
    for (int i=0; i<n; i++)
        result += (time[i] * (n-i));

    cout << result;
}