Today
-
Yesterday
-
Total
-
  • 백준 25556번 : 포스택
    코딩테스트 문제 풀이/백준 2023. 11. 20. 00:01

    문제

    나의 접근 방법

    나는 이 문제를 힌트 없이 풀어보려고 시도했다가 한 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);
        }
    }

    '코딩테스트 문제 풀이 > 백준' 카테고리의 다른 글

    행성 X3  (0) 2023.11.21
    백준 : 힙 정렬2  (0) 2023.11.21
    백준: 요세푸스 문제  (0) 2023.11.20
    백준: 최소, 최대  (0) 2023.11.20
    백준 : 회전하는 큐  (0) 2023.11.20

Designed by Tistory / Custom by 얼거스