본문 바로가기

Tech/Problem Solving

[백준 1874] 스택 수열 (Java)

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

시도 방법

- 해당 입력 받은 수열을 차례대로 가져와서 stack.peak() < n 이면 peak()가 n이 될 때까지 push를

- stack.peak() = n 이 되면 pop을 하고 다음 수열을 받아옴.

- try-catch를 사용하여 StackEmptyException이 나오면 "NO"를 출력하도록 구현

- 예외가 일어나지 않은 경우에는 stack이 비어있지 않거나 results의 길이가 N * 2가 아닌 경우 "NO"를 출력, 그렇지 않으면 결과를 출력하도록 함.

 

이러한 방법은 메모리 초과를 초래했음.

(try-catch문이 메모리를 많이 차지 하는지는 따로 공부를 해봐야 할듯)

 

접근 방법

- 첫 시도한 방법과 원리는 동일하지만, try-catch문을 사용하지 않도록 함.

 

 

최종 코드

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

public class Main {

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int N = scanner.nextInt();
        int[] numbers = new int[N];

        for (int i = 0; i < N; i++) {
            numbers[i] = scanner.nextInt();
        }

        Stack<Integer> stack = new Stack<>();
        List<Character> results = new ArrayList<>();


        int count = 1;
        boolean isAble = true;

        for (int i = 0; i < N; i++) {
            int n = numbers[i];

            if (isAble) {
                while (count <= n) {
                    stack.add(count++);
                    results.add('+');
                }

                if (stack.empty()) {
                    isAble = false;
                } else {
                    while (!stack.empty() && stack.peek() >= n) {
                        stack.pop();
                        results.add('-');
                    }
                }
            }
        }

        if (isAble) {
            for (int i = 0; i < results.size(); i++) {
                System.out.println(results.get(i));
            }
        } else {
            System.out.println("NO");
        }
    }
}
반응형

'Tech > Problem Solving' 카테고리의 다른 글

[백준 1182] 부분수열의 합 (Java)  (0) 2020.01.30
[백준 5430] AC (Java)  (0) 2020.01.27
[백준 1966] 프린터 큐 (Java)  (0) 2020.01.22
[백준 10866] 덱 (Java)  (0) 2020.01.16
[백준 9012] 괄호 (Java)  (0) 2020.01.12