백준 25556번 : 포스택

김아무개·2023년 3월 13일
0

백준

목록 보기
1/17

문제

나의 접근 방법

나는 이 문제를 힌트 없이 풀어보려고 시도했다가
한 3시간 동안 엉뚱하게 출력되는 결과만 보고있었다..ㅋ큐ㅠㅠ

나의 접근 방법은
문제를 그대로 읽어서 그대로 코드화 하는것이었는데
그러면 풀 수 없는 문제였다.

이 문제는
오름차순으로 출력할 수 있도록
입력된 숫자들을 4개의 스택에 담을 수 있는가?
라고 받아들였어야 했다.

랜덤으로 담아서 스택 4개 중에 의도하여 출력이라고 써있지만,
풀이를 위한 접근으로는 의도해서 담아 의도한 결과를 출력할수 있는가? 였던 것... ㅠㅠ

정답을 맞춘 코드는 다음과 같다.

내 코드

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

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int N = Integer.parseInt(br.readLine());
        StringTokenizer st = new StringTokenizer(br.readLine(), " ");
        
        int[] stack = new int[]{0, 0, 0, 0};
        int value;
        boolean isPossible = true;

        while (isPossible && st.hasMoreTokens()) {
            value = Integer.parseInt(st.nextToken());
            isPossible = false;

            for (int i = 0; i < stack.length; i++) {
                if (stack[i] < value) {
                    stack[i] = value;
                    isPossible = true;
                    break;
                }
            }
        }
        if (isPossible) System.out.println("YES");
        else            System.out.println("NO");
    }
}

1. 사용될 변수 선언 & 초기화

        int[] stack = new int[]{0, 0, 0, 0};
        // 4개의 스택의 top부분을 담당할 배열
        
        int value;
        // StringTokenizer로 분리한 문자를 정수로 변환하여 비교를 위해 잠시 저장해둘 변수
        
        boolean isPossible = true;
        // stack에 값이 저장되었는지를 알려고 만든 변수
        // isPossible이 false가 된 채로 stack배열의 탐색이 끝나면
        // value가 stack에 저장되지 못한 것이기 때문에 while 반복문 종료되며 "NO" 출력

2. 오름차순으로 정렬이 가능한지 알아보기위한 while 반복문

        while (isPossible && st.hasMoreTokens()) {
        // 반복문 종료조건: isPossible이 for문을 진행 한 뒤에도 false 이거나, 
        // 				 StringTokenizer 로 가져온 문자가 더이상 없으면 종료
        
            value = Integer.parseInt(st.nextToken());
            // StringTokenizr로 분리해온 문자1을 정수로 변환해서 value에 담음
            
            isPossible = false;
            // value 변수가 스택에 담길 수 있는지 확인하기 위한 변수
            // 담길 수 있는 조건 : stack에 들어있는 값 보다 value 값이 더 커야됨

            for (int i = 0; i < stack.length; i++) {
			// 스택이 4개이므로 4번 반복되는 반복문
            
                if (stack[i] < value) {
                // stack의 첫번째 값(문제에서 말하는 4개중 1개 스택의 top 값)이 value보다 작은가?
                
                    stack[i] = value;
                    // 그렇다면 해당 위치에 value를 집어넣는다.
                    
                    isPossible = true;
                    // value가 stack에 저장되었으니 true 
                    
                    break;
                    // value가 stack에 저장되었으니 for문 끝냄
                }
                // 만약 여기로 나오게 된다면 value는 stack에 담기지 못한것으로,
                // isPossible 값은 false가 된다. -> while 조건문을 통과하지 못하고 종료
            }
        }

3. 결과를 출력하기위한 조건문

        // if() -> isPossible이 true : 모든 값이 stack에 담김
        if (isPossible) System.out.println("YES");
        else            System.out.println("NO");
        // else -> isPossible이 false : stack에 담기지 못한 값이 존재함

그리고 아래는 내가 내맘대로 직독직해 하고 작성해서
엉뚱한 결과만 출력되는 가엾은 코드....🥹

import java.util.ArrayList;
import java.util.Random;

public class Main {
    public static void main(String[] args) {
        int N = 10;
        String Ns = "4 3 6 7 8 9 10 2 1 5";

        ArrayList<ArrayList<Integer>> list = new ArrayList();
        list.add(new ArrayList());
        list.add(new ArrayList());
        list.add(new ArrayList());
        list.add(new ArrayList());

        for (String s: Ns.split(" ")) {
            Random r = new Random();
            list.get(r.nextInt(4)).add(0, Integer.parseInt(s));
        }

        int min = 100001;
        int minIdx = -1;
        ArrayList<Integer> result = new ArrayList<>();
        while (list.size() > 0) {
            for (int j = 0; j < list.size(); j++) {
                if (list.get(j).size() == 0)  {
                    list.remove(j);
                    continue;
                }

                if (min > list.get(j).get(0)) {
                    min = list.get(j).get(0);
                    minIdx = j;
                }
            }
            result.add(min);
            list.get(minIdx).remove(0);
            if (list.get(minIdx).size() == 0) {
                list.remove(minIdx);
            }
            min = 100001;
            minIdx = -1;
        }
        System.out.println(result);
    }
}
profile
Hello velog! 

0개의 댓글