[ 다먹살 ]/- Coding

[백준] 1874 스택 수열

엉망으로살기 2021. 10. 18. 14:19
반응형

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

 

스택 카테고리에 있는 문제들을 계속 풀고 있다. 나는 아래와 같이 이 문제를 해결했다.

 

1. 기본적인 변수설정 및 수열을 입력받아 배열(arr)에 저장한다.

2. 스택에 넣어줄 변수(push)를 계속 증가시키면서 조건에 맞게 pop/push를 계속 진행한다.

   2-1. 최대 배열 인덱스를 넘기고, 스택 수열의 최대 개수를 넘어갈 경우에는 종료한다.

   2-2. 스택이 비어있거나, 스택의 top이 비교하는 수열 값과 다르면 push한다.

   2-3. 스택이 비어있지 않은 상태에서 스택의 top과 비교하는 수열 값이 같으면 pop하고 다음 수열 값으로 지정해준다.(index++)

3. 스택에 비었을 경우에는 정상적인 스택 수열이며, 맨 마지막 \n 문자를 제외하고 결과를 출력한다.

   3-1. 스택이 비지 않았을 경우에는 "NO"를 출력한다.

 


문제 및 입출력

 


예시

 


코드

import java.util.Scanner;
import java.util.Stack;

public class Main
{
    public static void main(String[] args)
    {
        // 기본 객체 및 변수 설정
        Scanner sc = new Scanner(System.in);
        Stack<Integer> s = new Stack<Integer>();
        StringBuilder sb = new StringBuilder();
        int max = sc.nextInt();
        int[] arr = new int[max];
        int index = 0;
        int push = 1;
        
        // 수열값 설정
        for(int i=0; i<max; i++)
        {
            arr[i] = sc.nextInt();
        }
        
        while(push<=max+1 && index<max)
        {
            // 스택이 비었을 때는 무조건 push하고 '+' 를 저장
            if(s.isEmpty())
            {
                s.push(push);
                sb.append("+");
                sb.append("\n");
                push++;
            }
            // 스택의 top과 수열의 값이 달랐을 때도 push하고 '+' 를 저장
            if(s.peek()!=arr[index])
            {
                s.push(push);
                sb.append("+");
                sb.append("\n");
                push++;
            }
            // 같으면 pop하고 '-' 를 저장
            else
            {
                s.pop();
                sb.append("-");
                sb.append("\n");
                index++;
            }
        }
        
        // 맨 마지막 \n 문자를 제외하고 출력
        if(s.isEmpty())
        {
            System.out.println(sb.toString().substring(0, sb.length()-1));
        }
        else
        {
            System.out.println("NO");
        }
    }
}

 

 

반응형