πŸ“— CS/Algorithm

[Stack ν™œμš©] 17299. μ˜€λ“±ν°μˆ˜

Dongwoongkim 2023. 9. 8. 20:18

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

 

17299번: μ˜€λ“±ν°μˆ˜

첫째 쀄에 μˆ˜μ—΄ A의 크기 N (1 ≤ N ≤ 1,000,000)이 μ£Όμ–΄μ§„λ‹€. λ‘˜μ§Έμ— μˆ˜μ—΄ A의 μ›μ†Œ A1, A2, ..., AN (1 ≤ Ai ≤ 1,000,000)이 μ£Όμ–΄μ§„λ‹€.

www.acmicpc.net

 

 

 

였큰수λ₯Ό ν’€μ—ˆλ‹€λ©΄ 맀우 μ‰½κ²Œ μ ‘κ·Όν•  수 μžˆλŠ” λ¬Έμ œμž…λ‹ˆλ‹€.

λ§€μ»€λ‹ˆμ¦˜μ€ λ™μΌν•œλ°, μ˜€ν°μˆ˜μ™€ 달리 μ–΄λ–€ 값을 λΉ„κ΅ν•˜κ³  μ–΄λ–€ 값을 μ •λ‹΅ 배열에 μ €μž₯ν•΄μ•Όν•˜λŠ”μ§€λ§Œ 잘 νŒŒμ•…ν•˜λ©΄ μ‰½κ²Œ ν’€ 수 μžˆμŠ΅λ‹ˆλ‹€.

 

μš°μ„  μ„ΈνŒ…μ„ ν•˜κΈ° μœ„ν•΄ 배열을 μž…λ ₯λ°›κ³  map을 μ΄μš©ν•΄ μΉ΄μš΄νŒ…ν•˜μ—¬ c 배열에 ν•΄λ‹Ή μˆ«μžκ°€ λ‚˜μ˜¨ 횟수λ₯Ό λ„£μ–΄μ€λ‹ˆλ‹€.

 

μ˜€ν°μˆ˜μ—μ„œλŠ” λ°°μ—΄ 값을 μŠ€νƒμ— λ„£κ³  μŠ€νƒμ˜ 탑값과 λΉ„κ΅ν–ˆλ‹€λ©΄, μ˜€λ“±ν°μˆ˜ 배열을 λ§Œλ“œλŠ” κ³Όμ •μ—μ„œλŠ” 비ꡐ κ³Όμ •μ—μ„œ v배열이 μ•„λ‹Œ c λ°°μ—΄μ˜ 인덱슀 값을 λΉ„κ΅ν•©λ‹ˆλ‹€. λ¬Όλ‘  푸쉬할 λ•ŒλŠ” 였큰수 λ°°μ—΄κ³Ό λ™μΌν•˜κ²Œ λ°°μ—΄ 값을 μ‚½μž…ν•©λ‹ˆλ‹€.

 

ν•„μžλŠ” 비ꡐ할 λ•ŒλŠ” stack의 top의 second ( cλ°°μ—΄ ), 푸쉬할 λ•ŒλŠ” stack의 top의 first ( vλ°°μ—΄ ) μ‚¬μš©ν•˜κΈ° μœ„ν•΄ μŠ€νƒμ— vλ°°μ—΄κ°’κ³Ό c배열값을 pair둜 λ¬Άμ–΄μ„œ μ‚¬μš©ν•˜μ˜€μŠ΅λ‹ˆλ‹€. 

 

μ†ŒμŠ€ μ½”λ“œ 

#include <iostream>
#include <vector>
#include <algorithm>
#include <utility>
#include <stack>
#include <queue>
#include <unordered_map>
#define FASTio ios_base :: sync_with_stdio(false), cin.tie(NULL), cout.tie(NULL)
#define endl '\n' 

using namespace std;

int n;
vector<int> v(1000001);
vector<int> cnt(1000001);
vector<int> ans(1000001,-1);
unordered_map<int, int> m;

stack<pair<int,int>> st;

int main()
{
    FASTio;
    cin >> n;

    for(int i=0;i<n;i++)
    {
        cin >> v[i];
        m[v[i]]++;
    }

    for(int i=0;i<n;i++)
    {
        cnt[i] = m[v[i]];
    }

    st.push(make_pair(v[n-1], cnt[n-1]));

    for(int i=n-2;i>=0;i--)
    {        
        while(!st.empty() && st.top().second <= cnt[i])
        {
            st.pop();
        }
    
        if(st.empty())
        {
            st.push(make_pair(v[i], cnt[i]));
            continue;
        } else {
            ans[i] = st.top().first;
            st.push(make_pair(v[i], cnt[i]));
        }
    }

    for(int i=0;i<n;i++){
        cout << ans[i] << ' ';
    }


    return 0;
}

 

 

μ²˜μŒμ— μ‹œκ°„μ΄ˆκ³Όκ°€ λ°œμƒν•΄μ„œ μ½”λ“œλ₯Ό μ‚΄νŽ΄λ³΄λ‹€κ°€ mapμ—μ„œ μ‹œκ°„μ΄ˆκ³Όκ°€ κ±Έλ¦°λ‹€λŠ” 것을 μΈμ§€ν–ˆμŠ΅λ‹ˆλ‹€.
κ·Έλž˜μ„œ map을 unordered_map으둜 λ°”κΏ”μ„œ ν•΄κ²°.

 

참고자료 

 

hash_map | unordered_map | map 차이 비ꡐ, νŠΉμ§• 정리 - C++

hash_와 unordered_에 λŒ€ν•˜μ—¬ hashλΌλŠ” 말이 λΆ™μ§€ μ•Šμ€ map,set은 자료λ₯Ό μ •λ ¬ν•΄μ„œ μ €μž₯ν•©λ‹ˆλ‹€. (keyλ₯Ό κΈ°μ€€μœΌλ‘œ μ˜€λ¦„μ°¨μˆœ μ •λ ¬) λ”°λΌμ„œ μˆœνšŒν•  λ•Œλ„ μ €μž₯된 데이터λ₯Ό 넣은 μˆœμ„œλŒ€λ‘œκ°€ μ•„λ‹Œ μžλ™μ •λ ¬λœ

eocoding.tistory.com