λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
μ•Œκ³ λ¦¬μ¦˜

[μŠ€νƒ, 큐] λ°±νŠΈλž˜ν‚Ή(이전 μƒνƒœ κΈ°μ–΅)은 μŠ€νƒμ„ ν™œμš©ν•˜μ„Έμš”

by μ„œμ•„λž‘πŸ˜ 2025. 5. 11.

 

 

이전 μƒνƒœλ₯Ό κΈ°μ–΅ν•΄μ•Ό ν•˜λŠ” ꡬ쑰(λ°±νŠΈλž˜ν‚Ή)μ—λŠ” μŠ€νƒμ„ ν™œμš©ν•˜μ„Έμš”.

 

λ“€μ–΄κ°€λ©°

μŠ€νƒκ³Ό 큐에 λŒ€ν•œ μ„€λͺ…은 ꡳ이 ν•˜μ§€ μ•Šκ² μŠ΅λ‹ˆλ‹€. λ‹€λ§Œ μ–΄λ–€ μ•Œκ³ λ¦¬μ¦˜μ— μŠ€νƒκ³Ό 큐λ₯Ό μ‚¬μš©ν•΄μ•Ό ν•˜λŠ”μ§€ μ§‘μ€‘ν•©μ‹œλ‹€. μŠ€νƒμ€ 기본적으둜 ν›„μž…μ„ μΆœ ꡬ쑰이기 λ•Œλ¬Έμ— DFS(깊이 μš°μ„  탐색), μž¬κ·€ 등에 μ‚¬μš©ν•©λ‹ˆλ‹€. λͺ¨λ“  것을 κ΄€ν†΅ν•˜λŠ” κ°œλ…μ€ 이전 μƒνƒœ 볡ꡬ라고 μƒκ°ν•©λ‹ˆλ‹€. μŠ€νƒ μžμ²΄κ°€ 데이터λ₯Ό μŒ“μ•„ μ˜¬λ¦¬λ‹€κ°€ λΊ„ λ•ŒλŠ” κ°€μž₯ μ΅œμ‹ μ— μŒ“μΈ λ°μ΄ν„°λ§Œ λΉΌκΈ° λ•Œλ¬Έμ— λ°”λ‘œ 이전 μƒνƒœλ₯Ό λ˜μ°Ύμ„ 수 μžˆμŠ΅λ‹ˆλ‹€. 이런 νŠΉμ„± 덕뢄에 μž¬κ·€, DFS, κ΄„ν˜Έ 검사, Undo λ“± μ–΄λ–€ λ°©ν–₯으둜 κ°”λ‹€κ°€ λ‹€μ‹œ λ˜λŒμ•„ 올 수 μžˆλŠ” 회기 λŠ₯λ ₯이 μžˆμŠ΅λ‹ˆλ‹€. λ”°λΌμ„œ, μŠ€νƒμ€ 이전 μƒνƒœλ₯Ό κΈ°μ–΅ν•΄ λ‚˜κ°€λ©΄μ„œ ν•„μš”ν•  λ•Œ λΉ λ₯΄κ²Œ popν•˜μ—¬ λΉ„κ΅ν•˜λŠ”λ° μ΅œμ ν™”λœ μžλ£Œκ΅¬μ‘°μž…λ‹ˆλ‹€.

큐의 κ²½μš°μ—λŠ” μš°μ„ μˆœμœ„ 큐가 μ•„λ‹Œ μ‹¬ν”Œ νλŠ” μŠ€νƒλ³΄λ‹€ λΉˆλ„κ°€ λ†’μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. μ„ μž…μ„ μΆœμ˜ νŠΉμ„±μƒ λŒ€κΈ°μ—΄, BFS(λ„ˆλΉ„ μš°μ„  탐색), μŠ€μΌ€μ€„λ§μ— μ‚¬μš©λ©λ‹ˆλ‹€. μš°μ„ μˆœμœ„ νλŠ” 이전 ν¬μŠ€νŒ…μ„ μ°Έκ³ ν•΄μ£Όμ„Έμš”!

 

문제

λ°±μ€€ 17298 였큰수

 

반볡문으둜 μ ‘κ·Όν•˜λ©΄ N제곱의 μ‹œκ°„λ³΅μž‘λ„κ°€ λ‚˜μ˜€κΈ° λ•Œλ¬Έμ— μ œν•œ μ‹œκ°„ μ΄ˆκ³Όμž…λ‹ˆλ‹€. 인덱슀λ₯Ό λŠ˜λ €λ‚˜κ°€λ©΄μ„œ 였큰수λ₯Ό μ €μž₯ν•˜λŠ” 방식도 ν•œκ³„κ°€ μžˆλ‹€λŠ” 것을 κΉ¨λ‹«κ³  λ‹€μ‹œ μ›μ μ—μ„œ μƒκ°ν•΄λ΄€μŠ΅λ‹ˆλ‹€. 이전 μƒνƒœλ₯Ό κΈ°μ–΅ν•΄ λ‚˜κ°€λ©΄μ„œ μƒˆλ‘œμš΄ μˆ«μžμ™€ λΉ„κ΅ν•˜λŠ” μ „ν˜•μ μΈ μŠ€νƒν™œμš© λ¬Έμ œλΌλŠ” 것을 λ– μ˜¬λ ΈμŠ΅λ‹ˆλ‹€.

 

풀이(μŠ€νƒ)

μŠ€νƒμ— μƒˆλ‘œ λ“€μ–΄μ˜€λŠ” μˆ˜κ°€ top에 μ‘΄μž¬ν•˜λŠ” μˆ˜λ³΄λ‹€ 크면 κ·Έ μˆ˜λŠ” μ˜€ν°μˆ˜κ°€ λ©λ‹ˆλ‹€.

μŠ€νƒμ—λŠ” 값이 μ•„λ‹Œ indexλ₯Ό κΈ°μ€€μœΌλ‘œ 였큰수λ₯Ό result에 λ‹΄μŠ΅λ‹ˆλ‹€.

#pragma once
// λ°±μ€€ 17298: 였큰수
#include <iostream>
#include <string>
#include <vector>
#include <stack>
using namespace std;


int main()
{
    ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);

    int N;
    cin >> N;

    vector<int> list(N, 0);
    for (int i = 0; i < N; i++)
        cin >> list[i];

    vector<int> result(N, 0);
    stack<int> s;
    int idx = 0;
    while (idx < N)
    {
        const int& target = list[idx];
        if (s.empty())
        {
            s.push(idx++);
            continue;
        }

        const auto top = s.top();
        if (list[top] < target)
        {
            result[top] = target;
            s.pop();
        }
        else
        {
            s.push(idx++);
        }
    }

    while (!s.empty())
    {
        const auto top = s.top();
        result[top] = -1;
        s.pop();
    }

    for (const auto& r : result)
        printf("%d ", r);
}

 

 

문제

λ°±μ€€ 2164 μΉ΄λ“œ2

 

풀이(큐)

큐λ₯Ό ν™œμš©ν•΄μ•Όκ² λ‹€λŠ” μƒκ°λ§Œ λ– μ˜¬λ¦°λ‹€λ©΄ λ‚˜λ¨Έμ§€λŠ” μ „ν˜€ λ¬Έμ œλ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

#pragma once
// λ°±μ€€ 2164: μΉ΄λ“œκ²Œμž„
#include <iostream>
#include <queue>
using namespace std;


int main()
{
    ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);

    int N;
    cin >> N;

    queue<int> q;
    for (int i = 1; i <= N; i++)
        q.push(i);

    while (q.size() > 1)
    {
        q.pop();
        const auto front = q.front();
        q.pop();
        q.push(front);
    }

    printf("%d", q.front());
}

(참고둜 const auto front에 const auto &λ₯Ό λΆ™μ˜€λ”λ‹ˆ λŸ°νƒ€μž„μ—λŸ¬κ°€ λ‚˜μ™”μ—ˆμŠ΅λ‹ˆλ‹€. 컴파일러의 차이일 수 μžˆμŠ΅λ‹ˆλ‹€. λΆˆν•„μš”ν•œ 볡사λ₯Ό 막기 μœ„ν•΄ 항상 μ°Έμ‘°λ₯Ό 톡해 κ°€μ Έμ˜€λ˜ μŠ΅κ΄€μ΄... 볡사가 ν•„μš”ν• λ• κ·Έλƒ₯ ν•©μ‹œλ‹€..!)

 

DFS와 BFSλŠ” 좔후에 문제λ₯Ό 더 많이 풀어보고 ν¬μŠ€νŒ…ν•˜κ² μŠ΅λ‹ˆλ‹€~

λŒ“κΈ€