본문 바로가기
코딩테스트

[백준 1874] 스택 수열 [java]

by 근즈리얼 2021. 11. 5.
728x90

문제

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


해결 방법

처음에 정말 어렵게 접근했다가 도저히 안풀려서 구글링을 하고 좌절했다....(이렇게 쉬운 문제였을 수가...)

 

스택과, 배열을 잘 이용하면 쉽게 풀 수 있는 문제이다.

 

입력받은 숫자들의 수열은 배열에 넣고

 

for문을 통해 1~n까지 반복한다.

이때 stack에는 1부터 순서대로 넣고

인덱스 값과 리스트의 값과 stack의 peek의 값을 비교한다.

여기서 인덱스 값은 0부터 pop을 할 때 하나씩 증가시킨다.

비교할 때 같으면 pop, 다르면 break를 해주면 된다.

 

마지막으로 결국 스택이 비어있다면 출력리스트의 넣은 값들을 차례대로 출력해주고 스택이 안 비어있다면 "NO"를 출력하면 된다.

 

코드

package stack;

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
import java.util.Stack;

public class Baek1874 {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);

        Stack<Integer> stack = new Stack<>();
        List<String> printList = new ArrayList<>();

        int num = scan.nextInt();

        int[] list = new int[num];

        for(int i = 0;i<num;i++){
            list[i] = scan.nextInt();
        }
        int index = 0;

        for(int i = 1; i<=num;i++){
            stack.push(i);
            printList.add("+");

            while (!stack.isEmpty()){
                if(stack.peek() == list[index]){
                    stack.pop();
                    printList.add("-");
                    index++;
                }else{
                    break;
                }
            }
        }
        if(stack.isEmpty()){
            for(String s : printList){
                System.out.println(s);
            }
        }else{
            System.out.println("NO");
        }


    }
}
728x90

댓글