(25556번) 포스택

문제


나의 생각

- 백준은 처음 풀어보는데 문제를 이해하기가 너무 어려운 듯 하다. 다른 사람들의 설명 그림을 몇 개 보고 알고리즘을 짜봤다. 

- false 기준으로 설명 해보고자 한다.

  • n = 5 
  • arr = 5, 4, 3, 2, 1

- 먼저 5라는 숫자를 입력하자고 하면 바로 입력이 된다. 

- 그 다음 들어오는 4는 처음 스택에 들어간 값보다 작기 때문에 다음 스택에 들어간다. 

- 그 다음 들어오는 3은 첫번째, 두번째 스택보다 작은 값이기에 다음 스택에 들어간다. 

- 그 다음 들어오는 2는 앞에 3개의 스택의 값보다 작기 때문에 다음 스택에 들어간다. 

- 마지막 1값은 4개의 스택의 peek 값보다 작기 때문에 다음 스택에 넣어야 하나 4개를 넘었으므로 false가 나온다.


나의 답안

import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int a = scanner.nextInt();
        scanner.nextLine();
        int[] arr = Arrays.stream(scanner.nextLine().split(" "))
                .mapToInt(Integer::parseInt)
                .toArray();

        if (check(a, arr)) {
            System.out.println("YES");
        } else {
            System.out.println("NO");
        }
    }

    public static boolean check(int a, int[] arr) {

        ArrayList<Stack> arrayList = new ArrayList<>(Arrays.asList(
                new Stack<>(),
                new Stack<>(),
                new Stack<>(),
                new Stack<>()
        ));


        for (int i = 0; i < a; i++) {
            int point = 1;
            for (int j = 0; j < arrayList.size(); j++) {
                if (arrayList.get(j).isEmpty()) {
                    arrayList.get(j).push(arr[i]);
                    break;
                }
                int peek = (int) arrayList.get(j).peek();
                if (peek > arr[i]) {
                    if (point >= arrayList.size()) {
                        return false;
                    }
                    point++;
                } else {
                    arrayList.get(j).push(arr[i]);
                    break;
                }
            }
        }

        return true;
    }
}

 

'BackJoon > Algorithm' 카테고리의 다른 글

(9012)괄호  (0) 2023.03.21
(24174) 알고리즘 수업 - 힙 정렬 2  (1) 2023.03.19
(1158) 요세푸스 문제  (0) 2023.03.17
(10818) 최소, 최대  (0) 2023.03.15
(1021번) 회전하는 큐  (0) 2023.03.14