본문 바로가기
Baekjoon/[Code.plus] 알고리즘 기초 1/2

[BOJ/백준] 1874 스택 수열

by 해적거북 2021. 7. 26.
728x90

● [문제번호 1874] 스택 수열

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

 

1874번: 스택 수열

1부터 n까지에 수에 대해 차례로 [push, push, push, push, pop, pop, push, push, pop, push, push, pop, pop, pop, pop, pop] 연산을 수행하면 수열 [4, 3, 6, 8, 7, 5, 2, 1]을 얻을 수 있다.

www.acmicpc.net

 

● 알아야 할 것

: stack, vector 자료구조와 메소드

 

● 풀이 과정

: 목표 배열에 도달하기 위해 stack 자료구조를 사용함

: 1. 목표 배열의 원소까지 stack에 저장 => '+'

: 2. stack의 맨 위 원소 출력 + 삭제 => '-'

: 1~2 번을 반복

더보기
https://st-lab.tistory.com/182 를 참고해주세요

 

● 주의 할 것

: 출력을 바로바로 하게 되면 "NO" 라는 결과를 얻을 수 없음

: 따라서 정답을 저장할 vector를 사용

 

● 참고 할 것

: (문제 이해) https://st-lab.tistory.com/182

 

● 풀이 코드

#include <bits/stdc++.h>

using namespace std;

// 연산(+, -)을 저장할 vector
vector<char> result;
// 목표 배열을 저장할 vector
vector<int> target;
// 목표 배열을 위해 거쳐갈 stack
stack<int> s;
// s_num : stack에 들어갔다가 나올 숫자
// flag : 오답인 경우를 위한 신호 변수
int N, s_num, flag;

int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    
    cin >> N;
    
    // vector을 초기화 하고 입력 받기
    target.assign(N, 0);
    for(int n = 0; n < N; n++)
        cin >> target[n];
    
    // stack을 거쳐갈 숫자는 1부터
    s_num = 1;
    // 목표 배열을 하나 씩 완성하는 반복문
    for(int t : target)
    {
        // s_num이 t가 될 때 까지 계속 result stack에 쌓임
        while(s_num <= t)
        {
            result.push_back('+');
            s.push(s_num++);
        }
        
        // 맨 위의 값 == 목표 배열의 한 원소 값
        if(s.top() == t)
        {
            result.push_back('-');
            s.pop();
        }
        // 목표 배열을 만들 수 없는 경우
        else
        {
            flag = 1;
            break;
        }
    }
    
    // 목표 배열을 만들 수 없는 경우
    if(flag == 1)
        cout << "NO";
    // 목표 배열을 만들기 까지 저장한 연산(+, -) vector 출력
    else
    {
        for(char c : result)
            cout << c << "\n";
    }

    return 0;
}

 

 

● [백준] - [알고리즘 기초 1/2] - [200 - 자료구조 1] 문제집

번호 문제 번호 문제 이름 풀이 링크
1 10828 스택 https://pirateturtle.tistory.com/153
2 9093 단어 뒤집기 https://pirateturtle.tistory.com/154
3 9012 괄호 https://pirateturtle.tistory.com/155
4 1874 스택 수열 https://pirateturtle.tistory.com/156
5 1406 에디터 https://pirateturtle.tistory.com/158
6 10845 https://pirateturtle.tistory.com/161
7 1158 요세푸스 문제 https://pirateturtle.tistory.com/162
8 10866 https://pirateturtle.tistory.com/164

 

728x90

'Baekjoon > [Code.plus] 알고리즘 기초 1/2' 카테고리의 다른 글

[BOJ/백준] 10866 덱  (0) 2021.07.26
[BOJ/백준] 1158 요세푸스 문제  (0) 2021.07.26
[BOJ/백준] 10845 큐  (0) 2021.07.26
[BOJ/백준] 1406 에디터  (0) 2021.07.26
[BOJ/백준] 9012 괄호  (0) 2021.07.26
[BOJ/백준] 9093 단어뒤집기  (0) 2021.07.26
[BOJ/백준] 10828 스택  (0) 2021.07.26

댓글