본문 바로가기
ps

99클럽 코테 스터디 1일차 TIL 뒤에 있는 큰 수 찾기

by nastorond 2024. 7. 22.

뒤에 있는 큰 수 찾기

뒤에 있는 큰 수 찾기 문제 링크

문제 설명

  • 정수로 이루어진 배열 numbers가 있습니다. 배열 의 각 원소들에 대해 자신보다 뒤에 있는 숫자 중에서 자신보다 크면서 가장 가까이 있는 수를 뒷 큰수라고 합니다.
  • 정수 배열 numbers가 매개변수로 주어질 때, 모든 원소에 대한 뒷 큰수들을 차례로 담은 배열을 return 하도록 solution 함수를 완성해주세요. 단, 뒷 큰수가 존재하지 않는 원소는 -1을 담습니다.
  • 리스트를 순회하며 현재의 수 보다 가장 크고 가까운 수를 answer 에 추가해 주거나 그런 수가 없다면 -1을 추가해주는 문제.

처음 생각했던 솔루션

  • 문제를 잘못 이해해서 dp 배열을 만들고 10^6으로 초기화해 그 값이 아닌 다른 값이 들어있으면 answer vector에 추가하는 방식으로 시도했다
  • 해당 숫자에서 가장 가까이 있는 큰 수를 찾는 문제였기 때문에, 이런식으로 접근하면 안된다는 걸 찾음

문제풀이

  • 숫자들의 배열에서 가장 뒤에 있는 숫자부터 탐색하는 방식을 채용했다.
  • answer에 넣어준 숫자는 stack 에 넣어주고 top 에 있는 숫자가 현재 보고 있는 숫자보다 크다면 stack에 넣어주고
  • 그게 아니라면 stack의 top이 현재 숫자보다 커질때까지 pop 을 하고, stack이 다 비워질 때 까지 숫자를 찾지 못하면 -1 를 answer에 넣어줬다.

코드

#include <string>
#include <vector>
#include <stack>
#include <algorithm>

using namespace std;

vector<int> solution(vector<int> numbers) {
    vector<int> answer;
    stack<int> st;

    answer.push_back(-1);
    st.push(*(numbers.end() - 1));
    for (auto it = numbers.end()-2; it != numbers.begin()-1; it--) {
        if (st.top() > *it) {
            answer.push_back(st.top());
            st.push(*it);
        } else {
            while (!st.empty()) {
                if (st.top() > *it) {
                    answer.push_back(st.top());
                    st.push(*it);
                    break;
                }
                st.pop();
            }
            if (st.empty()) {
                st.push(*it);
                answer.push_back(-1);
            }
        }
    }

    reverse(answer.begin(), answer.end());

    return answer;
}

회고

  • 요즘 알고리즘 문제를 풀면 거의 2차원 배열에서 Dfs, Bfs 하는 시뮬레이션 문제만 풀어서 그런지 해답이 잘 떠오르지 않고 많이 해맸다.
  • 이번 코테 준비 스터디로 좀 극복 해야할듯