백준 문제풀이

백준 #17299 (C++)

가껀 2022. 11. 5. 09:55

1. 문제

2. 풀이 및 소스 코드

- stack을 이용해서 푸는 문제였다. N개만큼 입력을 받아서 stack에 넣어줬다. 다만 빈도를 알아야 하기 때문에 해당 값을 index로 갖는 배열을 +1 해줬다. 이후 stack이 비어있지 않을 동안 while문을 진행했다.


List라는 이름을 갖는 stack도 만들어줘서 기존 S stack에서 빼낸 것 중 유효한 것은 List에 넣어줬다. 만약 List.top()을 index로 갖는 Count배열의 값이 S.top()을 index로 갖는 Count배열의 값 이하라면 유의미한 값이 아니므로 List에서 빼주고 S.top()의 값을 List에 넣어줬다. 그게 아니라면 정답을 저장하는 Sol stack에 List.top()을 넣어주고, List에는 S.top()의 값을 넣어줬다.

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

int Count[1000001] = { 0, };
std::stack <int> S;
std::stack <int> List;
std::stack <int> Sol;
int N;

void Input() {
    std::cin >> N;
    for (int i = 0; i < N; i++) {
        int X;
        std::cin >> X;
        S.push(X);
        Count[X]++;
    }
}

void Solve() {
    while (!S.empty()) {
        if (List.empty()) {
            List.push(S.top());
            Sol.push(-1);
        }
        else {
            while (true) {
                if (Count[List.top()] <= Count[S.top()]) {
                    List.pop();
                    if (List.empty()) {
                        Sol.push(-1);
                        List.push(S.top());
                        break;
                    }
                }
                else {
                    Sol.push(List.top());
                    List.push(S.top());
                    break;
                }
            }
        }
        S.pop();
    }
    while (!Sol.empty()) {
        std::cout << Sol.top() << " ";
        Sol.pop();
    }
}

int main() {
    Input();
    Solve();
}

3 느낀 점

- 문제 풀 때보다 글로 설명하는 과정이 더 어려운 문제였다. 이러한 과정이 귀찮긴 하지만 문제에 대한 생각을 정리하는 데에 큰 도움이 되는 것 같다.