[백준 풀이] 스택, 큐, 덱 (28278, 18258, 28279)

리진아·2025년 5월 30일

백준 풀이

목록 보기
9/10

스택

후입선출
재귀 함수의 동작 흐름과 같은 구조
데이터를 넣고 빼고만 가능


큐

선입선출


덱

양쪽 모두 삽입과 삭제가 가능
큐와 덱의 성질을 모두 가지고 있음





28278


삽입 -> stack.push()
비어있는지 확인 -> !stack.isEmpty()
맨 위 값 삭제 -> stack.pop()
크기 확인 -> stack.size()
가장 위 값 확인 -> stack.peek()


문제
정수를 저장하는 스택을 구현한 다음, 입력으로 주어지는 명령을 처리하는 프로그램을 작성하시오.

명령은 총 다섯 가지이다.

1 X: 정수 X를 스택에 넣는다. (1 ≤ X ≤ 100,000)
2: 스택에 정수가 있다면 맨 위의 정수를 빼고 출력한다. 없다면 -1을 대신 출력한다.
3: 스택에 들어있는 정수의 개수를 출력한다.
4: 스택이 비어있으면 1, 아니면 0을 출력한다.
5: 스택에 정수가 있다면 맨 위의 정수를 출력한다. 없다면 -1을 대신 출력한다.

입력
첫째 줄에 명령의 수 N이 주어진다. (1 ≤ N ≤ 1,000,000)

둘째 줄부터 N개 줄에 명령이 하나씩 주어진다.

출력을 요구하는 명령은 하나 이상 주어진다.

출력
출력을 요구하는 명령이 주어질 때마다 명령의 결과를 한 줄에 하나씩 출력한다.


public class Main {
	public static void main (String[] args) throws java.lang.Exception {
	    Scanner in = new Scanner(System.in);
	    int N= in.nextInt();
	    
        Stack<Number> stack = new Stack<>();
        StringBuilder result = new StringBuilder(); // StringBuilder 사용

        for(int i=0; i<N; i++){
            int x = in.nextInt();
            
            if(x == 1){
                stack.push(in.nextInt()); //스택에 삽입 -> push
            } else if(x == 2){
                if(!stack.isEmpty()){ //스택이 비어있는지 확인 
                    result.append(stack.pop()).append("\n"); //비어있지 않으면 하나를 꺼내서 출력 
                    // 하나 빼는 게 pop임
                } else {
                    result.append("-1\n"); // 비어있으면 -1
                }
            } else if(x == 3){
                result.append(stack.size()).append("\n"); // 크기 확인 -> size
            } else if(x == 4){
                result.append(stack.isEmpty() ? "1\n" : "0\n"); //비어있으면 1 비어있지 않으면 0
            } else if(x == 5){
                if(!stack.isEmpty()){ //스택이 비어있는지 확인 
                    result.append(stack.peek()).append("\n"); //비어있지 않다면 맨위 값 출력
                    // 맨 위 값 확인은 peek
                } else {
                    result.append("-1\n"); // 비어있으면 -1
                }
            }
        }

	    System.out.print(result);
	    
    }
}


18258


삽입 -> queue.add()
비어있는지 확인 -> queue.isEmpty()
가장 앞의 값(마지막으로 넣은) 삭제 -> queue.poll()
크기 확인 -> queue.size()
가장 앞의 값(마지막으로 넣은) 확인 -> queue.peek()


문제
정수를 저장하는 큐를 구현한 다음, 입력으로 주어지는 명령을 처리하는 프로그램을 작성하시오.

명령은 총 여섯 가지이다.

push X: 정수 X를 큐에 넣는 연산이다.
pop: 큐에서 가장 앞에 있는 정수를 빼고, 그 수를 출력한다. 만약 큐에 들어있는 정수가 없는 경우에는 -1을 출력한다.
size: 큐에 들어있는 정수의 개수를 출력한다.
empty: 큐가 비어있으면 1, 아니면 0을 출력한다.
front: 큐의 가장 앞에 있는 정수를 출력한다. 만약 큐에 들어있는 정수가 없는 경우에는 -1을 출력한다.
back: 큐의 가장 뒤에 있는 정수를 출력한다. 만약 큐에 들어있는 정수가 없는 경우에는 -1을 출력한다.

입력
첫째 줄에 주어지는 명령의 수 N (1 ≤ N ≤ 2,000,000)이 주어진다. 둘째 줄부터 N개의 줄에는 명령이 하나씩 주어진다. 주어지는 정수는 1보다 크거나 같고, 100,000보다 작거나 같다. 문제에 나와있지 않은 명령이 주어지는 경우는 없다.

출력
출력해야하는 명령이 주어질 때마다, 한 줄에 하나씩 출력한다.


public class Main {
	public static void main (String[] args) throws java.lang.Exception {
	    
	    //기존에는 scanner를 사용했지만 시간초과로 BufferedReader 사용용
	    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int N = Integer.parseInt(br.readLine());

        Queue<Integer> queue = new LinkedList<>();
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

        int x = 0; 
        int last = 0; //마지막값
        
        for(int i=0; i<N; i++){
            String input = br.readLine();
            String[] parts = input.split(" "); //push 때문에 공백으로 첫 번째 명령어만 추출
            String cmd = parts[0];

            
            if(cmd.equals("push")){
                x=Integer.parseInt(parts[1]);
                queue.add(x); //큐에 삽입
                last=x;
            } else if(cmd.equals("front")){
                if(!queue.isEmpty()){ //큐가 비어있는지 확인
                    //비어있지 않으면
                    bw.write(queue.peek() + "\n"); //가장 앞에 정수 출력
                } else {
                    bw.write("-1\n"); 
                }
            } else if(cmd.equals("pop")){
                if(!queue.isEmpty()){ //큐가 비어있는지 확인
                    //비어있지 않으면
                    bw.write(queue.poll() + "\n"); //가장 앞에 정수 삭제
                } else {
                    bw.write("-1\n");
                }
            } else if(cmd.equals("size")){
                bw.write(queue.size() + "\n"); // 큐 사이즈 출력력
            } else if(cmd.equals("empty")){
                //비어있으면 1 비어있지 않으면 0
                bw.write(queue.isEmpty() ? "1\n" : "0\n"); 
            }else if(cmd.equals("back")){
                if(!queue.isEmpty()){ //큐가 비어있는지 확인
                    // 가장 마지막으로 넣은 정수를 찾는 메서드는 없어서
                    // 미리 삽입 시 last 변수에 담아놓음
                    bw.write(last + "\n");
                } else {
                    bw.write("-1\n");
                }
            }
        }

	    // 모든 출력 버퍼 비우기
        bw.flush();
        // BufferedWriter 종료
        bw.close();
	    
    }
}


28279



덱 앞에 삽입 -> deque.addFirst()
덱 뒤에 삽입 -> deque.addLast()
비어있는지 확인 -> deque.isEmpty()
덱 맨 앞의 값 삭제 -> deque.removeFirst()
덱 맨 뒤의 값 삭제 -> deque.removeLast()
크기 확인 -> deque.size()
덱 맨 앞의 값 확인 -> deque.getFirst()
덱 맨 뒤의 값 확인 -> deque.getLast()


문제
정수를 저장하는 덱을 구현한 다음, 입력으로 주어지는 명령을 처리하는 프로그램을 작성하시오.

명령은 총 여덟 가지이다.

1 X: 정수 X를 덱의 앞에 넣는다. (1 ≤ X ≤ 100,000)
2 X: 정수 X를 덱의 뒤에 넣는다. (1 ≤ X ≤ 100,000)
3: 덱에 정수가 있다면 맨 앞의 정수를 빼고 출력한다. 없다면 -1을 대신 출력한다.
4: 덱에 정수가 있다면 맨 뒤의 정수를 빼고 출력한다. 없다면 -1을 대신 출력한다.
5: 덱에 들어있는 정수의 개수를 출력한다.
6: 덱이 비어있으면 1, 아니면 0을 출력한다.
7: 덱에 정수가 있다면 맨 앞의 정수를 출력한다. 없다면 -1을 대신 출력한다.
8: 덱에 정수가 있다면 맨 뒤의 정수를 출력한다. 없다면 -1을 대신 출력한다.

입력
첫째 줄에 명령의 수 N이 주어진다. (1 ≤ N ≤ 1,000,000)

둘째 줄부터 N개 줄에 명령이 하나씩 주어진다.

출력을 요구하는 명령은 하나 이상 주어진다.

출력
출력을 요구하는 명령이 주어질 때마다 명령의 결과를 한 줄에 하나씩 출력한다.


public class Main {
	public static void main (String[] args) throws java.lang.Exception {
	    
	    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int N = Integer.parseInt(br.readLine());

        Deque<Integer> deque = new ArrayDeque<>();

        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        
        for(int i=0; i<N; i++){
            String input = br.readLine();
            String[] parts = input.split(" "); //1과 2때문에 공백으로 첫 번째 명령어만 추출
            String cmd = parts[0];

            
            if(cmd.equals("1")){
                deque.addFirst(Integer.parseInt(parts[1])); //덱 앞에 삽입
                
            } else if(cmd.equals("2")){
                deque.addLast(Integer.parseInt(parts[1])); //덱 마지막에 삽입
                
            } else if(cmd.equals("3")){
                if(!deque.isEmpty()){ //덱이 비어있는지 확인
                    //비어있지 않으면
                    bw.write(deque.removeFirst() + "\n"); //맨 앞의 정수를 빼고 출력
                } else {
                    bw.write("-1\n");
                }
                
            } else if(cmd.equals("4")){
                if(!deque.isEmpty()){ //덱이 비어있는지 확인
                    //비어있지 않으면
                    bw.write(deque.removeLast() + "\n"); //맨 뒤의 정수를 빼고 출력
                } else {
                    bw.write("-1\n");
                }
                
            } else if(cmd.equals("5")){
                bw.write(deque.size() + "\n"); // 덱 사이즈 출력
                
            }else if(cmd.equals("6")){
                //덱이 비어있으면 1 비어있지 않으면 0
                bw.write(deque.isEmpty() ? "1\n" : "0\n"); 
                
            }else if(cmd.equals("7")){
                if(!deque.isEmpty()){ //덱이 비어있는지 확인
                    bw.write(deque.getFirst() + "\n"); // 맨 앞의 정수를 출력
                } else {
                    bw.write("-1\n");
                }
                
            }else if(cmd.equals("8")){
                if(!deque.isEmpty()){ //덱이 비어있는지 확인
                    bw.write(deque.getLast() + "\n"); // 맨 뒤의 정수를 출력
                } else {
                    bw.write("-1\n");
                }
            }
            
        }

	    // 모든 출력 버퍼 비우기
        bw.flush();
        // BufferedWriter 종료
        bw.close();
	    
    }
}
profile
이것저것 개발 블로그

0개의 댓글