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

#include<iostream>
#include<vector>
#include<stack>
#include<memory.h>
using namespace std;
int n;
vector<int> v;
int arr[1000001];
stack<int> s;

int main()
{   
    cin>>n;
    v.resize(n,0);
    memset(arr,-1,sizeof(arr));
    for(int i=0;i<n;i++)
    {
        cin>>v[i];

        while(s.empty() == false && v[s.top()] < v[i])
        {
            arr[s.top()] = v[i];
            s.pop();
        }
        s.push(i);
    }

    for(int i=0;i<n;i++)
        cout<<arr[i]<<" ";
}
  • 문제를 쉽게 생각해서 반복문을 여러개 이용해 풀었더니 시간초과가 났다
  • 그래서 살짝 힌트를 봤더니 Stack을 이용하는 문제였다
  • 값들을 입력 받을 때 마다 Stack이 비어있는지, s의 top을 index로 검색했을 때 값과 현재 들어온 값을 비교해 현재 들어온 값이 크다면 오큰수가 된 것이므로 while 문 안으로 들어간다
  • 이 안에서는 arr에 s.top()을 index로 사용해 현재 입력받은 값을 저장한 뒤 s.pop()을 통해 Stack에 있는 값을 빼준다
  • 이렇게 하면 오큰수를 만나면 배열에 순서대로 오큰수를 저장할 수 있다
  • 반복문이 끝나면 s에 i를 저장해주면 된다
접기/펼치기
이 문제는 짝짓기 문제이다.
 그 이유는 배열을 돌면서 자기 자신보다 크면서 가장 왼쪽에 있는 값을 찾아 배열에 저장하는 문제이기 때문에 짝을 짓는 것이라 볼 수 있다 
 짝짓기 문제의 팁은 왠만하면 Stack으로 풀린다
 하지만 일단 먼저 무식하게 풀어봐야한다. 즉 for문으로 때려박아 만들어 봤더니 시간초과가 떴다
 그래서 Stack으로 풀기위해 문제를 해석해보자. 1. 오큰수가 없다면 일단 Stack에 담아놓는다, 2. 결정이 되면 그땐 오큰수 이므로 배열등에 담아놓는다
 이 조건을 가지고 문제를 풀면 시간초과 없이 잘 풀리는 것을 볼 수 있다

'코딩 태스트 > 문제풀이' 카테고리의 다른 글

불!(x)  (0) 2025.01.16
보물섬  (0) 2025.01.14
효율적인 해킹  (0) 2025.01.12
트리  (0) 2025.01.12
치즈  (0) 2025.01.12