[Programmers] Lv2. 뒀에 μžˆλŠ” 큰 수 μ°ΎκΈ° | C++

2023. 6. 4. 19:52ㆍCoding Test/Programmers

πŸ”—λ¬Έμ œ λ³΄λŸ¬κ°€κΈ°
 

ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€

μ½”λ“œ μ€‘μ‹¬μ˜ 개발자 μ±„μš©. μŠ€νƒ 기반의 ν¬μ§€μ…˜ 맀칭. ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€μ˜ 개발자 λ§žμΆ€ν˜• ν”„λ‘œν•„μ„ λ“±λ‘ν•˜κ³ , λ‚˜μ™€ 기술 ꢁ합이 잘 λ§žλŠ” 기업듀을 맀칭 λ°›μœΌμ„Έμš”.

programmers.co.kr

 

πŸ‘¨‍πŸ’»ν’€μ΄ κ³Όμ •

 

μž…λ ₯ λ°μ΄ν„°μ˜ 크기가 백만 개라 \( O(N^2) \)μœΌλ‘œλŠ” ν’€ 수 μ—†μŠ΅λ‹ˆλ‹€. μ–΄λ–€ 자료ꡬ쑰λ₯Ό μ“ΈκΉŒ 고민을 많이 ν–ˆμŠ΅λ‹ˆλ‹€.

λ¬Έμ œμ—μ„œ λ³Ό 수 μžˆλŠ” νŠΉμ§•λ“€μ€ λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

 

  1. μž…λ ₯ 데이터λ₯Ό μ°¨λ‘€λŒ€λ‘œ 순회 μ‹œμž‘
  2. ν˜„μž¬ μˆ«μžκ°€ λ’€μ˜ μˆ«μžλ³΄λ‹€ μž‘λ‹€λ©΄, λ’€μ˜ μˆ«μžλŠ” λ’· ν°μˆ˜μ΄λ―€λ‘œ ν˜„μž¬ 숫자λ₯Ό ν•΄λ‹Ή λ’· 큰수둜 ꡐ체
  3. ν˜„μž¬ μˆ«μžκ°€ λ’€μ˜ μˆ«μžλ³΄λ‹€ 크닀면, λ’· ν°μˆ˜κ°€ μžˆμ„ μˆ˜λ„ 없을 μˆ˜λ„ μžˆλŠ” μˆ«μžμ΄λ―€λ‘œ λ”°λ‘œ 관리
    • λ”°λ‘œ κ΄€λ¦¬λ˜λŠ” 이 μˆ«μžλ“€μ€ ν›—λ‚  λ’· 큰수λ₯Ό λ§Œλ‚¬μ„ λ•Œ, ν•΄λ‹Ή λ’· ν°μˆ˜λ³΄λ‹€ μž‘μ€ μˆ«μžλ“€μ„ λ°”κΏ”μ•Ό 함

 

μ—¬κΈ°μ„œ μŠ€νƒ(Stack)을 μ‚¬μš©ν•˜λ©΄ 쒋을 것 κ°™λ‹€λŠ” 생각을 ν–ˆμ—ˆμ–΄μ•Ό ν–ˆλŠ”λ°, μ œκ°€ 아직 문제 뢄석 λŠ₯λ ₯이 λ–¨μ–΄μ§€λ‚˜ λ΄…λ‹ˆλ‹€. μœ„μ™€ 같은 νŠΉμ„±λ“€μ„ λ°”νƒ•μœΌλ‘œ, λ‹€μŒ μ•Œκ³ λ¦¬μ¦˜μ„ μ§œμ„œ κ΅¬ν˜„ν•˜μ˜€μŠ΅λ‹ˆλ‹€.

 

  1. μŠ€νƒμ˜ λ°μ΄ν„°λŠ” <숫자, 인덱슀>둜 κ΅¬μ„±λœλ‹€.
  2. 제일 처음 데이터인 (numbers[0], 0)λ₯Ό μŠ€νƒμ— λ„£κ³ , 1번 μΈλ±μŠ€λΆ€ν„° λκΉŒμ§€ 순회λ₯Ό μ‹œμž‘ν•œλ‹€.
  3. ν˜„μž¬ μˆ«μžκ°€ μŠ€νƒμ˜ μ΅œμƒμœ„ μˆ«μžλ³΄λ‹€ μž‘κ±°λ‚˜ 같을 경우, (ν˜„μž¬ 숫자, 인덱슀)λ₯Ό μŠ€νƒμ— μ‚½μž…
  4. 그게 μ•„λ‹ˆλΌλ©΄ λ’· 큰수λ₯Ό λ§Œλ‚œ κ²½μš°μ΄λ―€λ‘œ, μŠ€νƒμ—μ„œ ν•΄λ‹Ή λ’· ν°μˆ˜λ³΄λ‹€ μž‘μ€ μˆ«μžλ“€μ€ λͺ¨μ‘°λ¦¬ λ’· 큰수둜 λ³€κ²½
    • κ·Έ ν›„, λ’· 큰수인 (ν˜„μž¬ 숫자, 인덱슀)λ₯Ό μŠ€νƒμ— μ‚½μž…
  5. 순회λ₯Ό λ‹€ 돌고 μŠ€νƒμ— 남아 μžˆλŠ” μˆ«μžλ“€μ€ λ’· ν°μˆ˜κ°€ μ—†λŠ” μˆ«μžλ“€μ΄λ―€λ‘œ, ν•΄λ‹Ή 숫자의 인덱슀둜 μ°Ύμ•„κ°€ -1둜 λ³€κ²½

 

βœοΈμ†ŒμŠ€ μ½”λ“œ 및 κ²°κ³Ό

#include <string>
#include <vector>
#include <stack>
using namespace std;

vector<int> solution(vector<int> numbers) {
    stack<pair<int, int>> _stack;   // <숫자, 인덱슀>
    _stack.push(make_pair(numbers[0], 0));
    
    for(int i = 1; i < numbers.size(); i++)
    {
        if (numbers[i] <= _stack.top().first) {
            _stack.push(make_pair(numbers[i], i));
            continue;
        }
        
        int pivot = numbers[i];
        
        while(!_stack.empty() and _stack.top().first < pivot)
        {
            int index = _stack.top().second;
            numbers[index] = pivot;
            _stack.pop();
        }
        
        _stack.push(make_pair(pivot, i));
    }
    
    // λ’· ν°μˆ˜κ°€ μ—†λŠ” μˆ«μžλ“€ -1둜 λ³€κ²½
    while(!_stack.empty()) {
        auto element = _stack.top();
        numbers[element.second] = -1;
        _stack.pop();
    }
    
    return numbers;
}

 

제좜 결과

 

728x90
λ°˜μ‘ν˜•