[백준/Java] 1874번 스택 수열

Yujin·2025년 6월 18일

CodingTest

목록 보기
7/51

문제

https://www.acmicpc.net/problem/1874

문제 접근 방법

8 -> 1 부터 8 까지 수를 정렬한다
4 3 6 8 7 5 2 1
1 2 3 4
4 pop, 3 pop
1 2 5 6
6 pop
1 2 3 6 7 8
8 pop, 7 pop, 5,2,1 pop

스택의 첫줄에서 길이를 읽어온다, 길이 : N
그 길이만큼 for문으로 1부터 stack에 넣어준다 : while( int i < k(입력된 숫자) )
if 그 숫자랑 같으면 pop
위를 반복

나의 코드

package B1874;

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

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int N = sc.nextInt();
        Stack<Integer> stack = new Stack<>();
        StringBuilder sb = new StringBuilder(); // 답을 저장(+,-)

        int start = 0; //start를 1이 아닌 0으로 설정한 이유 -> 아래 for문에서 i가 start + 1부터 시작을 해야하기 때문에 처음을 0으로 잡음
        // 입력받은 수열을 처리할 동안 반복 (N회 반복)
        while (N-->0) { //N--와 N>0을 합친 것
            int value = Integer.parseInt(sc.next()); // 입력 값을 하나씩 읽어옴
            // 입력 받은 값이 현재 스택에 넣을 값보다 큰 경우
            if (value > start) {
                // 현재 스택의 다음 값부터 입력 받은 값까지 스택에 추가
                for (int i = start + 1; i <= value; i++) {
                    stack.push(i);
                    sb.append("+\n"); // + 저장
                }
                // start를 입력 받은 값으로 업데이트
                start = value;
            } 
            // 입력 받은 값이 스택의 맨 위 값과 다르면 수열을 만들 수 없음
            else if (stack.peek() != value) {
                // 수열을 만들 수 없음을 출력하고 종료
                System.out.println("NO");
                return;
            }
            // 입력 받은 값이 스택의 맨 위 값과 같은 경우 스택에서 값을 제거
            stack.pop();
            sb.append("-\n");
        }
        System.out.println(sb);
    }
}

0개의 댓글