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

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 |