algorithm

[์ฝ”๋“œํŠธ๋ฆฌ ์กฐ๋ณ„๊ณผ์ œ] Preprocessing

rkawk 2024. 7. 24. 11:45

์‹œ๊ฐ„์„ ์ค„์ผ ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ค‘ ํ•˜๋‚˜๋กœ ์„ค๋ช…๋˜๋Š” ์ „์ฒ˜๋ฆฌ์ด๋‹ค.

์ „์ฒ˜๋ฆฌ๋ผ๋Š” ๋‹จ์–ด์˜ ์˜๋ฏธ์™€ ๊ฐ™์ด ์ž…๋ ฅ๋ฐ›์€ ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•ด ์„ ์ œ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜์—ฌ ์™„์ „ํƒ์ƒ‰์„ ํ”ผํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.

 

๋ฌธ์ œ 1) ๊ด„ํ˜ธ ์Œ ๋งŒ๋“ค์–ด์ฃผ๊ธฐ

๋‹จ์ˆœ ๋ชจ๋“  ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ํƒ์ƒ‰ํ•˜๋ฉด ๋ชจ๋“  ์ธ๋ฑ์Šค๋ฅผ ํƒ์ƒ‰ํ•˜๋ฉด์„œ ์—ฌ๋Š” ๊ด„ํ˜ธ๊ฐ€ ๋‘๊ฐœ์ธ ์‹œ์ž‘์ ์„ ์ฐพ๊ณ , ๋‹ซ๋Š” ๊ด„ํ˜ธ๊ฐ€ ๋‘๊ฐœ์ธ ๋ ์ ์„ ์ „๋ถ€ ์ฐพ์•„์„œ ํ•ด์•ผ๋œ๋‹ค. ์ด๋Š” (((()))), (())(())์™€ ๊ฐ™์€ ๊ฒฝ์šฐ๊ฐ€ ์ตœ์•…์˜ ๊ฒฝ์šฐ๋กœ ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ, ((์„ ์žก๊ณ  ))์„ ์ฐพ๊ธฐ์œ„ํ•ด ๋ชจ๋“  ์ธ๋ฑ์Šค๋ฅผ ํƒ์ƒ‰ํ•˜๋Š” ๊ณผ์ •์—์„œ ์‹œ๊ฐ„๋ณต์žก๋„๋Š” O(N^2)๊ฐ€ ๋‚˜์˜ค๊ฒŒ ๋œ๋‹ค.

 

sol1) ๋ˆ„์ ํ•ฉ ์‘์šฉ ์ „์ฒ˜๋ฆฌ

๋ˆ„์ ํ•ฉ์˜ ๋Œ€์ƒ์„ ํŠน์ • ์ธ๋ฑ์Šค ์˜ค๋ฅธ์ชฝ์˜ ))์˜ ๊ฐœ์ˆ˜๋กœ ํ•œ๋‹ค.

 

( ( ) ) ( ( ) ) ( ( ) ) ์™€ ๊ฐ™์€ ์˜ˆ์‹œ๊ฐ€ ์žˆ๋‹ค๊ณ  ํ•˜์ž.

์ธ๋ฑ์Šค์˜ ์—ญ์ˆœ์œผ๋กœ ))์˜ ๋ˆ„์  ๊ฐœ์ˆ˜๋ฅผ ์ฑ„์šฐ๋ฉด

3 3 3 2 2 2 2 1 1 1 1 0 ์ด ๋œ๋‹ค.

((์™€ ))๊ฐ€ ์Œ์„ ์ด๋ฃจ๋ฏ€๋กœ ์ฒ˜์Œ ์ž…๋ ฅ๋ฐ›์€ ๋ฌธ์ž์—ด์„ ์ˆœ์ฐจ์ ์œผ๋กœ ํƒ์ƒ‰ํ•˜๋ฉฐ ((๊ฐ€ ๋‚˜์˜ฌ ๊ฒฝ์šฐ ๋ˆ„์  ๊ฐœ์ˆ˜๋ฅผ ์ „์ฒด ์ •๋‹ต์— ํ•ฉํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

 

#include <iostream>
#include <string>
#include <queue>
#include <algorithm>
using namespace std;
string a;
queue<int>b1, b2;
long long ans;
int main() {
    cin>>a;
    for(int i=1; i<a.size(); i++) {
        if(a[i] == '(' && a[i-1] == '(')
            b1.push(i);
        if(a[i] == ')' && a[i-1] == ')')
            b2.push(i-1);
    }
    while(!b1.empty()) {
        int cur = b1.front(); b1.pop();
        while(b2.front() < cur && !b2.empty()) {
            b2.pop();
        }
        if(b2.empty())
            break;
        ans += b2.size();
    }
    cout<<ans;
    return 0;
}

 

๋‚˜๋Š” ((์™€ ))๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๊ฒฝ์šฐ์˜ ์ธ๋ฑ์Šค๋ฅผ ์ „๋ถ€ ์ €์žฅํ•˜๊ณ  )) queue์˜ front๊ฐ€ ((์˜ ์ธ๋ฑ์Šค๋ณด๋‹ค ์ž‘๋‹ค๋ฉด ๋นผ์ฃผ๊ณ  )) queue์˜ size๋ฅผ ๋”ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„ํ•˜์˜€๋‹ค.

 

 

๋ฌธ์ œ 2) ์ด์ƒํ•œ ํญํƒ„

ํŠน์ • ๋ฒˆํ˜ธ๋ฅผ ๊ฐ€์ง„ ํญํƒ„์ด ๊ฐ€์žฅ ์ตœ๊ทผ ์–ด๋А ์ธ๋ฑ์Šค์— ์ž…๋ ฅ์ด ๋“ค์–ด์™”๋Š”์ง€ ๋ฏธ๋ฆฌ ์ฒดํฌํ•ด๋†“์œผ๋ฉด ๋œ๋‹ค.

ํญํƒ„์€ ๋ฌด์กฐ๊ฑด ์ˆœ์„œ๋Œ€๋กœ ๋“ค์–ด์˜ค๊ณ , K ๊ฑฐ๋ฆฌ ์ด๋‚ด์— ์žˆ๋Š” ๊ฐ™์€ ๋ฒˆํ˜ธ๋ฅผ ๊ฐ€์ง„ ํญํƒ„๋“ค์€ ๋ฌด์กฐ๊ฑด ๊ฐ€์žฅ ์ตœ๊ทผ ๋“ค์–ด์˜จ ํญํƒ„๊ณผ ์—ฐ๊ด€์ด ๋œ๋‹ค.

๊ทธ๋Ÿฌ๋ฏ€๋กœ ๊ฐ€์žฅ ์ตœ๊ทผ ๋“ค์–ด์˜จ ๊ฐ™์€ ๋ฒˆํ˜ธ์˜ ํญํƒ„์„ ์ฒดํฌํ•˜๊ณ , K ์ดํ•˜์ธ์ง€ ํ™•์ธํ•˜๋ฉด ๋œ๋‹ค.

 

#include <iostream>
#include <algorithm>
using namespace std;
int N, K, bomb[1000001], ans;
int main() {
    cin>>N>>K;
    for(int i=1; i<=N; i++) {
        int bnum; cin>>bnum;
        if(!bomb[bnum]) bomb[bnum] = i;
        else if(i - bomb[bnum] <= K) ans = max(ans, bnum);
        else bomb[bnum] = i;
    }
    if(!ans) cout<<-1;
    else cout<<ans;
    return 0;
}

 

๋ฌธ์ œ 3) ์ตœ์†Œ ์—๋„ˆ์ง€ ๋น„์šฉ

๊ทธ๋ฆฌ๋”” ๋А๋‚Œ์˜ ํ’€์ด๋ฅผ ์š”๊ตฌํ•˜๋Š” ๋ฌธ์ œ์ด๋‹ค.

ํŠน์ • ์ง€์ ์— ๋„๋‹ฌํ•˜๊ธฐ ์œ„ํ•œ ์ตœ์†Œ ์ฝ”์ŠคํŠธ๋Š” ํŠน์ • ์ง€์  ์ด์ „์— ์žˆ๋Š” ๋‹ค๋ฅธ ์ง€์ ๋“ค ์ค‘์— ๊ฐ€์žฅ ์ž‘์€ ์ฝ”์ŠคํŠธ๋ฅผ ๊ฐ€์ง„ ์ง€์ ์—์„œ ์—๋„ˆ์ง€๋ฅผ ์ฑ„์›Œ ๊ฐ€์ ธ์˜ค๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.

๊ทธ๋Ÿฌ๋ฏ€๋กœ ํŠน์ • ์ง€์ ์— ํ•ด๋‹นํ•˜๋Š” ์ธ๋ฑ์Šค์— ํŠน์ • ์ง€์ ๊นŒ์ง€์˜ ๋ชจ๋“  ์ง€์ ์˜ ์ตœ์†Œ ์ฝ”์ŠคํŠธ๋ฅผ ์ €์žฅํ•˜๊ณ , ๋ชจ๋“  ์ง€์  ์‚ฌ์ด์˜ ์—๋„ˆ์ง€ ๊ฐ’์„ ๊ณฑํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

 

#include <iostream>
using namespace std;

long long N, energy[100001], cost[100001], dp[100001], ans;
int main() {
    cin>>N;
    for(int i=0; i<N-1; i++) cin>>energy[i];
    for(int j=0; j<N; j++) cin>>cost[j];
    dp[0] = cost[0];
    for(int i=1; i<N-1; i++) {
        dp[i] = min(cost[i], dp[i-1]);
    }
    for(int i=0; i<N-1; i++) {
        ans += energy[i]*dp[i];
    }
    cout<<ans;
    return 0;
}

'algorithm' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

๋ฐฑ์ค€ 16965  (0) 2024.07.30
๋ฐฑ์ค€ 21870  (0) 2024.07.30
[์ฝ”๋“œํŠธ๋ฆฌ ์กฐ๋ณ„๊ณผ์ œ] +1 -1 Technique  (0) 2024.07.17
๋ฐฑ์ค€ 1593  (1) 2024.07.08
๋ฐฑ์ค€ 2482  (0) 2024.06.26