본문 바로가기
알고리즘

백준 s2 1874 스택수열 c++

by kyj0032 2024. 1. 10.

풀이

계속 push하다가 원하는 수가 나오면 pop,

pop하고 나서 또 top이 원하는 숫자면 다시 pop <- 반복

생각해본 것

  • endl 때문에 자꾸 시간 초과가 남
    • 참고 https://stackoverflow.com/questions/213907/stdendl-vs-n
    • endl == '\n' + std::flush
    • endl은 출력 버퍼도 비우기 때문에 \n과 시간 차이가 꽤 남
    • 아마 ps 시작할 때 endl보다 '\n'이 더 빠르다를 알고 시작해서 \n만 쓰다가, 최근에 까먹고 다시 씀

  • input이 10^6인데, 10만 배열은 굳이 필요 없을 것 같아 그때 그때 cin으로 target 숫자를 받음
    • 마지막 target 숫자를 받고 또 불필요한 target을 받게 되므로, 예외처리 해줌 // if (tCnt == N)
    • 위 제출 목록에서 맨 위에가 그때 그때 cin으로 받아서 처리, 바로 아래가 input배열로 받아서 처리한 것
      • 메모리는 더 적게, 시간은 더 많이 걸림

  • 메모리는 스택, 힙, 데이터로 구성 (참고 https://www.acmicpc.net/board/view/34836)
    • 스택: 함수 호출, 지역 변수, 매개 변수 (크기가 작은 편)
    • 힙: 사용자가 직접 할당
    • 데이터: 전역 변수, static
  • 전역으로 선언했을 때, 보통 int는 10^8 개까지 가능
  • 그래서 동적할당을 하면 배열 크기를 좀 더 늘릴 수 있음
/*boj s2 1874 스택 수열*/
#include <iostream>
#include <stack>
#include <vector>
using namespace std;

int N;

int main(void)
{
    ios::sync_with_stdio(0);
    cin.tie(0);

    stack<int> S;
    cin >> N;
    int target;
    vector<char> result;

    cin >> target;
    int tCnt = 1;
    for (int i = 1; i <= N; i++)
    {
        S.push(i);
        result.push_back('+');

        while (!S.empty() && S.top() == target)
        {
            result.push_back('-');
            S.pop();
            if (tCnt == N)
                break;
            cin >> target;
            tCnt++;
        }
    }

    // 출력
    if (S.empty())
    {
        for (char v : result)
        {
            cout << v << "\n";
        }
    }
    else
    {
        cout << "NO"
             << "\n";
    }
}

'알고리즘' 카테고리의 다른 글

백준 g5 5430 AC c++  (0) 2024.01.11
백준 s4 1021 회전하는 큐 c++  (0) 2024.01.11
백준 s4 2164 카드2 c++  (0) 2024.01.10
백준 g5 2493 탑 c++  (0) 2024.01.10
c++ 4. 연결리스트 연습문제  (0) 2024.01.10