처음 접근 때는 입력과 stack push를 같은 for문 안에서 돌려서 입력과 stack push가 독립적으로 가지 못했다. 이 자체가 로직 설계가 엉망이었다는 건데... 확실히 로직 설계 자체가 아직 서툰 것 같다. 경우의 수를 나누는 훈련도 제대로 안되어 있고... 경우의 수를 제대로 나눴다, 제대로 이해해서 짰다기보다는 이렇게 하면 되겠지 하는 느낌으로 해결한 것 같아서 아쉬운 문제, 반성이 필요한 부분이다. 주먹 구구식으로 해결한 문제
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Stack;
public class BOJ1874 {
static BufferedReader br;
static StringBuilder sb;
static Stack<Integer> stack;
static int n, i, targetList[], val;
// error 여부를 체크하기 위한 flag
static boolean err;
public static void main(String[] args) throws Exception {
br = new BufferedReader(new InputStreamReader(System.in));
sb = new StringBuilder();
stack = new Stack<Integer>();
n = Integer.parseInt(br.readLine());
targetList = new int[n];
for (i = 0; i < n; i++) {
// 만들 targetList 생성
targetList[i] = Integer.parseInt(br.readLine());
}
// stack에 집어넣을 val을 1로 선언해두기
val = 1;
// target에 대해서
for (i = 0; i < n; i++) {
// stack에 집어넣을 조건 설정
while (targetList[i] >= val && val <= n) {
// target값을 만들기 위해서는 해당 값까지는 stack에 넣어줘야 한다.
stack.push(val++);
sb.append("+\n");
}
if (stack.isEmpty()) {
// targetList 생성 전에 stack이 비어있게 되면 err 케이스
err = true;
break;
}
if (targetList[i] == stack.peek()) {
// targetList는 pop을 통해 생성
stack.pop();
sb.append("-\n");
}
}
// err 상황이나 targetList를 다 돌았는데 stack내부에 값이 남아 있다면
if (err || !stack.isEmpty()) {
System.out.println("NO");
} else {
System.out.println(sb);
}
}
}
앞으로 주석도 잘 달아가면서 로직 설계도 잘 하자 좀.
'온라인 저지 > BOJ' 카테고리의 다른 글
[BOJ/Java] 12927 배수 스위치 (0) | 2022.02.13 |
---|---|
[BOJ/Java] 5430 AC (0) | 2022.02.13 |
[BOJ/Java] 18258 큐2, 10866 덱 (0) | 2022.02.13 |
[BOJ/Java] 11047 동전 0 (0) | 2022.02.13 |
[BOJ/Java] 1436 영화감독 숌 (0) | 2022.02.13 |
댓글