Algorithm🐰/λ°±μ€€

[λ°±μ€€] 3020 개λ˜₯벌레 prefix sum(λˆ„μ ν•©)

Jouureee 2022. 2. 21. 13:36

문제 :

https://www.acmicpc.net/problem/3020

 

3020번: 개λ˜₯벌레

개λ˜₯벌레 ν•œ λ§ˆλ¦¬κ°€ μž₯μ• λ¬Ό(μ„μˆœκ³Ό μ’…μœ μ„)둜 가득찬 동꡴에 λ“€μ–΄κ°”λ‹€. λ™κ΅΄μ˜ κΈΈμ΄λŠ” N미터이고, λ†’μ΄λŠ” H미터이닀. (N은 짝수) 첫 번째 μž₯애물은 항상 μ„μˆœμ΄κ³ , κ·Έ λ‹€μŒμ—λŠ” μ’…μœ μ„κ³Ό μ„μˆœμ΄

www.acmicpc.net

 

뢄석 :

1. μ„μˆœκ³Ό μ’…μœ μ„μ˜ ꡬ뢄은 μ§μˆ˜μΈμ§€ ν™€μˆ˜μΈμ§€λ‹€. λ”°λΌμ„œ 개λ˜₯λ²Œλ ˆκ°€ 높이 1인 곳을 μ§€λ‚œλ‹€λ©΄ μ’…μœ μ„μ€ 1인 높이, μ„μˆœμ€ H -1 인 높이λ₯Ό λ™μ‹œμ— μ§€λ‚œλ‹€κ³  μƒκ°ν•˜λ©΄ λœλ‹€.

2. μ„μˆœλΌλ¦¬μ˜ (λ˜λŠ” μ’…μœ μ„λΌλ¦¬μ˜) μˆœμ„œ λ°”λ€œμ€ 상관이 μ—†λ‹€. 개λ˜₯λ²Œλ ˆλŠ” N 길이λ₯Ό ν†΅κ³Όν•˜μ•Ό ν•˜κΈ° λ•Œλ¬Έμ΄λ‹€. μ„μˆœμ˜ 길이만큼 κ°€μ§„ μ„μˆœ 개수λ₯Ό 배열에 μ €μž₯ν•œλ‹€. (μ’…μœ μ„λ„ λ˜‘κ°™λ‹€)

3. 높이가 HμΌλ•Œ 개λ˜₯λ²Œλ ˆλŠ” μ’…μœ μ„μ˜ H λ†’μ΄λ§Œμ„ μ§€λ‚˜κ°„λ‹€. H-1μΌλ•ŒλŠ” H-1 높이인 μ’…μœ μ„ + H 높이인 μ’…μœ μ„μ„ μ§€λ‚˜κ°„λ‹€. λ§ˆμ°¬κ°€μ§€λ‘œ H-2μΌλ•Œ ==> H-2 높이 μ’…μœ μ„ + H-1 높이 μ’…μœ μ„ + H 높이 μ’…μœ μ„μ„ μ§€λ‚˜κ°„λ‹€. λˆ„μ ν•©μ„ μ μš©ν•˜λ©΄ 될거 κ°™λ‹€.

4. μ„μˆœκ³Ό μ’…μœ μ„μ„ λ™μ‹œμ— μ§€λ‚˜κ°€λ―€λ‘œ sum 배열에 i높이 μ„μˆœ + H-i 높이 μ’…μœ μ„μ„ 더해 개λ˜₯λ²Œλ ˆκ°€ μ§€λ‚˜κ°ˆ 총 μž₯애물을 μ €μž₯ν•œλ‹€.

 

c++ μ½”λ“œ :

//
//  3020_ firefly.cpp
//  SOMAπŸ‘©πŸ»‍πŸ’»
//
//  Created by JoSoJeong on 2022/02/21.
//

#include <iostream>
#include <string.h>
#include <algorithm>

using namespace std;
int N, H, h;
long long mite[5000001]; //μ„μˆœ
long long tite[5000001]; //μ’…μœ μ„
long long sum[5000001];

int main(){
    cin >> N >> H;
    memset(mite, 0, sizeof(mite));
    memset(tite, 0, sizeof(tite));
    memset(sum, 0, sizeof(sum));
    
    for(int i = 1; i <= N; i++){
        cin >> h;
        if(i % 2 == 1){ // μ„μˆœ
            mite[h]++; //h 높이인 개수
        }else{
            tite[h]++;
        }
    }
    
    for(int i = H - 2; i >= 1; i--){ // λˆ„μ ν•©
        mite[i] += mite[i+1];
        tite[i] += tite[i+1];
    }
    
    for(int i = 1; i <= H; i++){
        sum[i] = mite[i] + tite[H + 1 - i]; // i 높이 μ„μˆœ + H - i 높이 μ’…μœ μ„
    }
    
    sort(sum+1, sum+H+1); // 1 ~ H
    
    int cnt = 0;
    int target = sum[1];
    for(int i = 1; i <= H; i++){
        if(sum[i] == target){
            cnt++;
        }
    }

    
    cout << target << " " << cnt <<'\n';
    
    return 0;
}