백준 25556번

황상익·2023년 10월 17일
0

백준

목록 보기
1/15

<문제>
https://www.acmicpc.net/problem/25556

<내가 생각한 문제 풀이>
예제를 보면 4 3 6 7 8 9 10 2 1 5 오름 차순 으로 나타내려면 Stack이 각각 필요하다.
각각 필요하다는 의미는 4 보다 큰 수가 와야 하는데 다음이 3이 오게되면 오름차순으로 나타낼 수 없을 것이다. 그래서 3을 따로 담을 수 있는 Stack을 하나 더 필요하다.
pop과 push 그리고 peek을 잘 활용해 볼 필요가 있다.

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

public class 포스택25556 {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.parseInt(br.readLine());
        int[] arr = Arrays.stream(br.readLine().split(" ")).mapToInt(Integer::parseInt).toArray();

        //비교를 위한 가장 작은 수를 각 스택에 삽입한다.
        Stack<Integer>[] stacks = new Stack[4];
        for(int i=0; i<4; i++) {
            stacks[i] = new Stack<>();
            stacks[i].push(0);
        }

        //스택의 peek보다 큰 수라면 삽입하기
        for(int i=0; i<n; i++) {
            boolean flag = false;
            for(int j=0; j<4; j++) {
                if(stacks[j].peek() < arr[i]) {
                    stacks[j].push(arr[i]);
                    flag = true;
                    break;
                }
            }

            //모든 스택에 삽입하지 못 했다면
            if(!flag) {
                System.out.println("NO");
                return;
            }
        }

        //순열 청소가 완료되면
        System.out.println("YES");

    }
}

다른 풀이가 있나 봤는데 좀 다른 풀이가 있어 이거는 직접 짜보지는 못했고 따라치면서 의미를 파악하려고 노력했다.

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

public class Main25556 {
    public void solution() throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int num = Integer.parseInt(br.readLine());
        Stack[] stacks = new Stack[4];

        for (int i = 0; i < 4; i++)
            stacks[i] = new Stack<>();
        StringTokenizer stk = new StringTokenizer(br.readLine());
        int[] arr = new int[num];
        int idx = 0;

        while (stk.hasMoreTokens()) {
            arr[idx++] = Integer.parseInt(stk.nextToken());

            for (int i = 0; i < num; i++) {
                int target = arr[i]; //이번 순서 순열
                boolean flag = false;
                for (int j = 0; j < 4; j++) {
                    if (stacks[j].isEmpty()) { // 스택 비었을 때 넣기
                        flag = push(stacks[j], target);
                        break;
                    }

                    Integer peek = (Integer) stacks[j].peek();
                    if (target > peek){ //이번 순서 순열이 스택에 최상단 보다 크다면 넣기
                        flag = push(stacks[j], target);
                        break;
                    }
                }

                if (!flag) {
                    System.out.println("NO");
                    return;
                }
            }
            System.out.println("YES");
        }
    }

    public  boolean push(Stack stack, int target) {
        boolean flage = true;
        stack.push(target);
        return flage;
    }

    public static void main(String[] args) throws IOException {
        new Main25556().solution();
    }
}
profile
개발자를 향해 가는 중입니다~! 항상 겸손

0개의 댓글