백준 > 스택 수열

jinvicky·2023년 11월 27일
0

ALG

목록 보기
4/62

package src.baekjoon;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Stack;
import java.util.StringTokenizer;

public class Main {
    public static void main(String[] args) throws IOException {

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder result = new StringBuilder(); // 결과문자열

        int length = Integer.parseInt(br.readLine()); // 수열 라인 수
        Stack<Integer> stackA = new Stack<Integer>(); //스택

        int cnt = 1;

        for (int i = 0; i < length; i++) {
            StringTokenizer str = new StringTokenizer(br.readLine());
            while (str.hasMoreTokens()) {
                String numToken = str.nextToken();
                int inputNum = Integer.parseInt(numToken);

                if(cnt < inputNum || stackA.isEmpty()) {
                    for (int k = cnt; k <= inputNum; k++) { //<= 실수
                        stackA.push(k);
                        result.append("+\n"); //스택에 추가할 때는 +를 result에 append
                        cnt++;
                    }
                }

                if(stackA.peek() == inputNum) {
                    stackA.pop();
                    result.append("-\n");
                }
            }
        }
        if(!stackA.isEmpty()) {
            result.setLength(0);
            result.append("NO\n");
        }
        System.out.println(result); //최종 결과
    }
}

결과 : 예시 결과는 제대로 출력했지만 오답

오답 분석

  • cnt를 이용한 for문에서 k 초기화에서 cnt + 1하지 않아서
  • pop하는 조건 분기처리를 틀려서 (값이 다를 경우 바로 NO를 출력하도록 하기)
  • cnt++이 아니라 inputNum값으로 엎어치기하는 것이다.

중간에 NO인 경우를 테스트했을 때 계산이 1번 모자라서 cnt를 1로 시작했는데, for문에서 cnt + 1이 들어가야 했다.

나의 로직

계산해가면서 cnt랑 inputNum이 같으면 stack에서 pop하고 아닐 경우 continue해서 마지막에 stack이 비지 않았을 때 NO를 출력한다.

정답 로직

계산해가면서 cnt랑 inputNum이 같지 않으면 바로 NO를 println()하고 리턴한다. (계산 및 비교를 종료한다.)

아래는 정답

package src.baekjoon;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Stack;

public class Main2 {
    public static void main(String[] args) throws IOException {

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder result = new StringBuilder(); // 결과문자열

        Stack<Integer> stackA = new Stack<Integer>(); //스택

        int length = Integer.parseInt(br.readLine()); // 수열 라인 수

        int cnt = 0;

        while (length-- > 0) {
            int inputNum = Integer.parseInt(br.readLine());

            if (inputNum > cnt) {
                for (int k = cnt + 1; k <= inputNum; k++) { //ERROR
                    stackA.push(k);
                    result.append("+\n");
                }
                cnt = inputNum; // CNT++이 아니라 inputNum을 그대로 넣어버리는 것이다.
            }

            if (stackA.peek() != inputNum)  { //그냥 바로 빠져나가네
                System.out.println("NO");
                return;
            }
        }
        System.out.println(result);
    }
}

문제 풀이 소요 시간

4일

profile
일단 쓰고 본다

0개의 댓글