[백준] 1874번 스택 수열 (java)

0

코딩테스트

목록 보기
8/37
post-thumbnail

<문제>


문제 출처 : https://www.acmicpc.net/problem/1874

<나의 풀이>

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

public class Main {
    public static void main(String[] args) {
        // 1. 값 세팅
        Scanner sc = new Scanner(System.in);
        int N = sc.nextInt();
        int A[] = new int[N];
        // A 배열에 값 넣어주기
        for (int i = 0; i < N; i++) {
            A[i] = sc.nextInt();
        }
        Stack<Integer> s = new Stack<>();
        int stack_num = 1;  // 오름차순으로 넣어줄 자연수
        boolean operstionResult = true; // true면 부호 출력, false면 부호 출력 X
        StringBuffer bf = new StringBuffer();   // 부호를 담아주기 위함. 만약 문제조건과 달리 스택으로 구현 안되면 칼같이 No만 출력해줘야되서.
        // String operation = ""; 처음엔 string operation에 부호를 저장했는데 메모리 초과됨.ㅠ

        // 2. stack 값 비교
        for (int i = 0; i < N; i++) { // N 만큼 반복
            if (A[i] >= stack_num) {  // 배열의 값이 스택에 넣을 값 보다 크거나 같을 때
                while (A[i] >= stack_num) { // 배열의 값과 같아질 때 까지 반복하기
                    s.push(stack_num);
                    stack_num++;
                    // operation += "+\n";
                    bf.append("+\n");   // 부호 출력시 줄바꿈 필요해서
                }
                s.pop();
                // operation += "-\n";
                bf.append("-\n");
            } else {    // 배열의 값이 오름차순 자연수 보다 작을 때
                int temp = s.pop(); // stack에 담긴 값을 빼서
                if (temp > A[i]) {  // stack에서 뺀 값이 배열의 자연수보다 크면 차곡차곡 쌓인 stack의 아래값을 더 뺄 수 없어서
                    System.out.println("NO");   // 조건에 맞지 않아 NO를 출력해주고
                    operstionResult = false;    // operstionResult 를 false로 바꿔 부호가 출력되지 않도록 해준다.
                    break;
                } else {
                    // operation += "-\n";
                    bf.append("-\n");

                }
            }
        }
        // if(operstionResult) System.out.println(operation);
        if (operstionResult) System.out.println(bf.toString());
    }
}

<핵심 개념>

생각보다 어려웠던 stack 문제였다. stack 개념은 이해했는데 조건을 주는 부분이 어려워서 몇 번 틀렸다. 풀다가 막혀서 유튜브를 봤는데도 잘 모르겠어서 손코딩 한 후에야 이해가 된 문제였다. ㅠ
그리고 부호를 저장할 때 string 연산으로 해결하려 했는데 아뿔사 메모리가 초과됐다.
그래서 찾아보니 StringBuffer로 해결했다. String이랑 StringBuffer에 대한 내용을 공부해서 블로그에 올려야겠다.

profile
두둥탁 뉴비등장

0개의 댓글