코딩가딩가

[JAVA]BOJ 1874, 스택 수열

Noooodle 2024. 8. 31. 21:48

출력값을 어떻게 저장해야되나.. 고민하다가 두 번이나 틀렸다. 처음은 BufferWriter 썼고 출력초과 받았다. 지피티한테 물어봐서 어떻게 원인 알고 해결하려는데 좀 어려운것 같아서, 좀 더 쉬운 String에 추가하는 형식으로 출력값을 만들었다. 그랬더니 메모리초과가 나더라. 알고보니 String에 직접 추가하는 방식은 새로운 String을 계속 만드는거라 메모리를 마니잡아먹는댄다 !! 새로운걸 알았다..

GPT가 알려줌

StringBuilder를 써서 출력값을 만드니 정답으로 인정됐다!

난 자바에 대해 너무 모른다고 느낀다.. 천천히 조금씩 배워야겠다고 생각하지만 마음이 급해진다. 아무튼 ..

 


 

푸는 방법은 수열이 주어지고 글자 하나를 tmp라고 하자. 그리고 정상적인 수열인지 아닌지를 판별하는 flag=1 변수를 선언한다.

1. tmp보다 stack에 넣을 값(j)이 작을때 stack.push를 한다. 그리고 ans에 append "+\n"를 한다.

2. 스택의 제일 위에있는 값이(stack.peek) tmp와 같을때 stack.pop을 한다. 그리고 ans에 append "-\n"를 한다.

3. 만약 stack.peek값이 tmp보다 클때, 정상적인 수열이 아니므로 flag를 0으로 표시한다.

 

1, 2, 3을 반복한다. 반복범위는 n번이다.


import java.io.*;
import java.util.Stack;

public class BOJ1874 {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        Stack<Integer> stack = new Stack<>();
        int i, j = 1, n, tmp, flag = 1;
        StringBuilder ans = new StringBuilder(); // StringBuilder 사용

        n = Integer.parseInt(br.readLine());

        for (i = 0; i < n; i++) {
            tmp = Integer.parseInt(br.readLine());

            // 다음에 stack에서 꺼낼 값(stack.peek())이 tmp보다 작을때, stack이 비었을때 = j <= tmp -> push하기
            while (j <= tmp) {
                stack.push(j++);
                ans.append("+\n");
            }

            if (stack.peek() == tmp) {
                stack.pop();
                ans.append("-\n");
            } else // 틀린 수열인 경우
                flag = 0;
        }

        if (flag == 1)
            System.out.println(ans);
        else
            System.out.println("NO");
    }
}

 

'코딩가딩가' 카테고리의 다른 글

[JAVA]BOJ 15654, N과 M (5)  (0) 2024.09.06
[JAVA]BOJ 17298, 오큰수  (1) 2024.09.01
[JAVA]BOJ 16120, PPAP  (0) 2024.08.31
[JAVA]BOJ 5397, 키로거  (0) 2024.08.29
[JAVA]BOJ 2504, 괄호의 값  (1) 2024.08.29