본문 바로가기
온라인 저지/BOJ

[BOJ/Java] 1874 스택 수열

by ahj 2022. 2. 13.

처음 접근 때는 입력과 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

댓글