πŸ• Baaaaaarking/0x05κ°• - μŠ€νƒ

[BOJ G1][C++] λ°±μ€€ 3015번: μ˜€μ•„μ‹œμŠ€ μž¬κ²°ν•©

선달 2022. 2. 16. 23:07
λ°˜μ‘ν˜•

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

 

3015번: μ˜€μ•„μ‹œμŠ€ μž¬κ²°ν•©

첫째 쀄에 μ€„μ—μ„œ 기닀리고 μžˆλŠ” μ‚¬λžŒμ˜ 수 N이 주어진닀. (1 ≤ N ≤ 500,000) λ‘˜μ§Έ 쀄뢀터 N개의 μ€„μ—λŠ” 각 μ‚¬λžŒμ˜ ν‚€κ°€ λ‚˜λ…Έλ―Έν„° λ‹¨μœ„λ‘œ 주어진닀. λͺ¨λ“  μ‚¬λžŒμ˜ ν‚€λŠ” 231 λ‚˜λ…Έλ―Έν„° 보닀 μž‘λ‹€. μ‚¬λžŒ

www.acmicpc.net

 

문제

μ˜€μ•„μ‹œμŠ€μ˜ μž¬κ²°ν•© 곡연에 Nλͺ…이 ν•œ μ€„λ‘œ μ„œμ„œ 기닀리고 μžˆλ‹€.

이 역사적인 μˆœκ°„μ„ λ§žμ΄ν•˜κΈ° μœ„ν•΄ μ€„μ—μ„œμ„œ 기닀리고 있던 λ°±μ€€μ΄λŠ” κ°‘μžκΈ° μžκΈ°κ°€ λ³Ό 수 μžˆλŠ” μ‚¬λžŒμ˜ μˆ˜κ°€ κΆκΈˆν•΄ μ‘Œλ‹€.

두 μ‚¬λžŒ A와 Bκ°€ μ„œλ‘œ λ³Ό 수 있으렀면, 두 μ‚¬λžŒ 사이에 A λ˜λŠ” B보닀 ν‚€κ°€ 큰 μ‚¬λžŒμ΄ μ—†μ–΄μ•Ό ν•œλ‹€.

쀄에 μ„œμžˆλŠ” μ‚¬λžŒμ˜ ν‚€κ°€ μ£Όμ–΄μ‘Œμ„ λ•Œ, μ„œλ‘œ λ³Ό 수 μžˆλŠ” 쌍의 수λ₯Ό κ΅¬ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€.

μž…λ ₯

첫째 쀄에 μ€„μ—μ„œ 기닀리고 μžˆλŠ” μ‚¬λžŒμ˜ 수 N이 주어진닀. (1 ≤ N ≤ 500,000)

λ‘˜μ§Έ 쀄뢀터 N개의 μ€„μ—λŠ” 각 μ‚¬λžŒμ˜ ν‚€κ°€ λ‚˜λ…Έλ―Έν„° λ‹¨μœ„λ‘œ 주어진닀. λͺ¨λ“  μ‚¬λžŒμ˜ ν‚€λŠ” 231 λ‚˜λ…Έλ―Έν„° 보닀 μž‘λ‹€.

μ‚¬λžŒλ“€μ΄ μ„œ μžˆλŠ” μˆœμ„œλŒ€λ‘œ μž…λ ₯이 주어진닀.

좜λ ₯

μ„œλ‘œ λ³Ό 수 μžˆλŠ” 쌍의 수λ₯Ό 좜λ ₯ν•œλ‹€.

 

풀이1 - μ‹€νŒ¨

(λ°˜λ‘€ μ•Œλ €μ€˜.. 제발..)

 

μ²˜μŒμ— μ‹œλ„ν•œ λ‚˜μ˜ 풀이..

input듀을 λ²‘ν„°λ‘œ λ°›κ³  이쀑 for문을 μ΄μš©ν•΄μ„œ ν’€μ—ˆλŠ”λ°

자꾸 9% μ—μ„œ ν‹€λ Έλ‹€κ³  λ‚˜μ˜΄ γ… γ… γ… 

 

#include <iostream>
#include <stack>
#include <vector>

using namespace std;

vector <int> input;
stack <int> s;
long long ans = 0;

int main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    
    // μž…λ ₯
    int n;
    cin >> n;
    for(int i=0; i<n; i++){
        int tmp;
        cin >> tmp;
        input.push_back(tmp);
    }
    
    // 계산
    for(int i=0; i<n; i++){
        s.push(0);
        for(int j=i+1; j<n; j++){
            if(s.top() > input[j]){
                break;
            }
            ans++;
            if(input[i] < input[j]){
                break;
            }
            s.push(input[j]);
        }
        while(!s.empty()) s.pop();
    }
    
    // 좜λ ₯
    cout << ans;
    
    return 0;
}

 

μ•„λ¬΄νŠΌ 아무리 μ—΄μ‹¬νžˆ κ²Œμ‹œνŒμ„ 뒀져봐도 μ•ˆλΌμ„œ..

λ‹€λ₯Έ ν’€μ΄λ‘œ κ°„λ‹€

 

풀이 2

μž…λ ₯을 λ°›λŠ” λ™μ‹œμ— μŠ€νƒμ— λ„£μœΌλ©΄μ„œ κ³„μ‚°ν•˜λŠ” μ‹€μ‹œκ°„ 풀이

μ‹œκ°„λ³΅μž‘λ„ λ©΄μ—μ„œλ„ 이게 더 λ‚«λ‹€

λ‹€λ§Œ 풀이가 쑰금. 많이. λ³΅μž‘ν• λΏ..


μš°μ„  λͺ¨λ“  μ• λ“€μ˜ ν‚€κ°€ λ‹€ λ‹€λ₯΄λ‹€κ³  κ°€μ •ν•΄μ„œ κ°„λ‹¨ν•˜κ²Œ λ‘œμ§μ„ κ΅¬μ„±ν–ˆλ‹€

ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€λŠ” 예제λ₯Ό 살짝 λ³€ν˜•ν•΄μ„œ "6 2 4 1 2 5 1" 을 λ„£μ–΄ λ‹΅ 7이 λ‚˜μ˜€λ©΄ 됨

 

// Authored by : seondal
// Co-authored by : -

//#include <bits/stdc++.h>
#include <iostream>
#include <stack>

using namespace std;

stack<int> s;
long long ans;

int main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    
    int n;
    cin >> n;
    
    while(n--){
        int h;
        cin >> h;
        
        // (2)
        while(!s.empty() && s.top().first < h){
            s.pop();
            ans++;
        }
        
        // (1)
        if(!s.empty()) ans++;
        s.push(h);
    }
   
    cout << ans;
    
    return 0;
}

/*
 */

 

λ‘œμ§μ„ μ„€λͺ…해보겠닀

 

μ°¨λ‘€λŒ€λ‘œ 값을 μž…λ ₯λ°›μ•„μ„œ μŠ€νƒμ— λ„£μœΌλ©° μŒμ„ λ§Œλ“œλŠ”λ°,

μž…λ ₯값이 μ•ˆμ— μžˆλŠ” κ°’κ³Ό μ ‘μ΄‰ν•˜λ©΄ ν•˜λ‚˜μ˜ 쌍이 μ™„μ„±λ˜λŠ”κ±°λΌκ³  μƒκ°ν•˜λ©΄ νŽΈν•˜λ‹€

(ex. top=2 μΌλ•Œ 4λ₯Ό λ„£μœΌλ©΄ 2와4 ν•œμŒμ΄ λ§Œλ“€μ–΄μ§)

 

그리고 ν•œμŒμ΄ μ™„μ„±λ λ•Œλ§ˆλ‹€ ans++;

 

(1)

κ·Έλž˜μ„œ λΉ„μ–΄μžˆμ§€ μ•Šμ€ μŠ€νƒμ— 값을 λ„£μ„λ•Œλ§ˆλ‹€ ans++

μŠ€νƒμ΄ λΉ„μ–΄μžˆλ‹€λ©΄ λ§Œλ‚˜λŠ” μ• κ°€ μ—†μœΌλ―€λ‘œ 쌍이 μ•ˆλ§Œλ“€μ–΄μ‘ŒμœΌλ‹ˆκΉŒ ans μ¦κ°€μ‹œν‚€μ§€ μ•Šκ³  κ·Έλƒ₯ push

 

(2)

μ΄λ•Œ λ„£μœΌλ €λŠ” 값보닀 κΌ­λŒ€κΈ° 값이 더 μž‘λ‹€λ©΄ μ§€κΈˆ λ„£μœΌλ €λŠ” μ• λŠ” κΌ­λŒ€κΈ° κ°’ 밑에 μžˆλŠ” 애도 λ³Ό 수 μžˆμ„κ±°λ‹€

λ”°λΌμ„œ μžμ‹ λ³΄λ‹€ μž‘μ€ κΌ­λŒ€κΈ°κ°’λ“€μ„ while둜 계속 κΊΌλ‚Ό (pop)건데,

μ΄λ•Œ κΊΌλ‚΄μ§€λŠ” 애듀도 λ‹€ μ§€κΈˆ λ„£μœΌλ €λŠ” 애와 쌍이 λ§Œλ“€μ–΄μ§€κΈ° λ•Œλ¬Έμ— ans++

 


 

μž˜ν–ˆμœΌλ‹ˆ λ‹€μŒλ‹¨κ³„λ‘œ λ„˜μ–΄κ°€λ³΄μž

ν‚€κ°€ 같은 애듀이 μžˆλŠ”κ²½μš°, κ·Έ 애듀은 ν•˜λ‚˜λ‘œ μ·¨κΈ‰ν•œλ‹€. (쀑볡을 μΈμ •ν•˜μ§€ μ•ŠμŒ)

근데 계산을 ν•΄μ•Όν•˜κΈ° λ•Œλ¬Έμ— ans 카운트λ₯Ό μ—°μ†μœΌλ‘œ μ€‘λ³΅λœ μ• λ“€ 수 만큼 λ”ν•΄μ£ΌλŠ” λ°©μ‹μœΌλ‘œ μ§„ν–‰ν•œλ‹€

μ—°μ†μœΌλ‘œ μ€‘λ³΅λœ μ• λ“€ 수λ₯Ό ν‘œν˜„ν•˜κΈ° μœ„ν•΄ pair<int, int> λ₯Ό μ΄μš©ν•˜μ—¬ μ²«λ²ˆμ§ΈλŠ” ν‚€λ₯Ό, λ‘λ²ˆμ§ΈλŠ” 연속 쀑볡 수λ₯Ό ν‘œν˜„ν•˜κΈ°λ‘œ ν–ˆλ‹€.

 

(1) pop을 ν• λ•Œ ansλ₯Ό ν•˜λ‚˜μ”© μ¦κ°€μ‹œν‚€μ§€ μ•Šκ³  κΌ­λŒ€κΈ°μ˜ 연속 쀑볡 수 만큼 μ¦κ°€μ‹œν‚¨λ‹€.

(2) λ„£μœΌλ €λŠ” 애와 κΌ­λŒ€κΈ° μ•  ν‚€κ°€ κ°™λ‹€λ©΄,

(3) λ“€μ–΄κ°€λŠ” μ• λŠ” μžμ‹ κ³Ό 같은 ν‚€μ˜ μ• μ™€μ˜ μŒμ„ 이루고 μžˆμœΌλ―€λ‘œ κΌ­λŒ€κΈ° μ• μ˜ second 값을 ++ ν•΄μ€€λ‹€. (연속 쀑볡 수 증가)

(4) 그리고 κ·Έ 전에 μžμ‹ κ³Ό 같은 킀인 애듀과도 μŒμ„ μ΄λ£¨λ―€λ‘œ ans λ₯Ό 연속 쀑볡 수만큼 증가

(5) 근데 λ„£μœΌλ©΄μ„œ 같은킀듀 뒀에 큰 ν‚€ ν•˜λ‚˜κ°€ μžˆλ‹€λ©΄ κ±”λž‘ μŒμ„ μ΄λ£¨λ―€λ‘œ ans++;

 

// Authored by : seondal
// Co-authored by : -

//#include <bits/stdc++.h>
#include <iostream>
#include <stack>

using namespace std;

stack<pair<int, int>> s;
long long ans;

int main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    
    int n;
    cin >> n;
    
    while(n--){
        int h;
        cin >> h;
        
        // (1)
        while(!s.empty() && s.top().first < h){
            ans += s.top().second;
            s.pop();
        }
        
        // (2)
        if(!s.empty() && s.top().first == h) {
            ans += s.top().second;  //(4)
            s.top().second++;  //(3)
            
            // (5)
            if(s.size() > 1) ans++;
            
            continue;
        }
        
        if(!s.empty()) ans++;
        
        s.push({h,1});
    }
   
    cout << ans;
    
    return 0;
}

/*
 */

 

끝!

내인생 첫 Gold1!!

μˆ˜κ³ ν–ˆλ‹€!!!

λ°˜μ‘ν˜•