본문 바로가기
Baekjoon/[1] 자료구조

[백준] 10828번 스택 JAVA (자바) 풀이

by Poorm 푸름 2023. 6. 14.

문제 10828번

 : 아래와 같은 [명령] 스택으로 구현해보기 

 

 [명령]

  

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

 

 [입력]

 : 첫째 줄에 주어지는 명령의 수 N (1 ≤ N ≤ 10,000)

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

 

 [출력]

 : 명령 출력할 때마다 한 줄에 하나씩 출력

 

 [스택]

 

 : 스택은 나가고 들어오는 문이 하나다

 : 후입선출 (최근에 들어온 데이터가 먼저 나간다)  

   예) 1 - 3 - 5 순서대로 push 하고 pop 하면 최근에 들어온 5가 나간다

 

 [스택 연산]

 

 init()  스택을 초기화
 create()  스택을 생성
 is_empty(s)  스택이 비어있는지 검사
 is_full(s)  스택이 가득 찼는지 검사 
 push(e)  스택의 맨 위에 요소 e 추가
 pop(s)  스택의 맨 위 요소를 삭제
 peek(s)  스택의 맨 위 요소를 삭제하지 않고 반환
 top()  스택 맨 위에 있는 데이터 값 반환
 push()  스택에 데이터 삽입
 pop()  스택에서 데이터 삭제하여 반환
 isempty()  스택에 원소가 없으면 'True', 있으면 'False' 값 반환
 isfull()  스택에 원소가 없으면 'False', 있으면 'True' 값 반환

 *            :  코드 구현에 사용된 것

 

 [코드]

import java.io.*;
import java.util.*;
public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        Stack<Integer> stack = new Stack<>();  // 스택 선언
        int n = Integer.parseInt(br.readLine()); // 첫째줄 입력 N
        for (int i = 0; i < n; i++) {
        String s = br.readLine(); // integer 안써도 돼
        //contains, equals 차이
        //contains: string 문자열에 포함되어있는지
        //equals: string 문자열과 동일한지
           
           if(s.contains("push")){
                String spt[] = s.split(" ");
				stack.push(Integer.parseInt(spt[1]));
                //다른방법
                //StringTokenizer st = new StringTokenizer(br.readLine());
                //String s = st.nextToken();
                //if(s.equals("push")){stack.push(Integer.parseInt(st.nextToken()));}
            }
            
            else if(s.contains("pop")){
                if(stack.empty()){
                    bw.write(-1+"\n");
                }
                else{
                    bw.write(stack.pop()+"\n");
                }
            }
            
            else if(s.contains("size")){
                bw.write(stack.size()+"\n");
            }
            
            else if(s.contains("empty")){
                if(stack.empty()){
                    bw.write(1+"\n");
                }
                else{
                    bw.write(0+"\n");
                }
            }
            
            else if(s.contains("top")){
                if(stack.empty()){
                    bw.write(-1+"\n");
                }
                else{
                    bw.write(stack.peek()+"\n");
                }               
            }        
        }
     bw.flush();   
    }
}

 

 [해설]

 : Stack<Integer> stack = new Stack<>(); 으로 스택선언

 : for (int i = 0; i < n; i++) 대신에 while(n-->0) 써도 좋다

 

 : if(s.contains)문으로 구현 시작

   contains 대신에 equals를 써도 괜찮다

 

 : s.split(" ")는 입력받은 문자열을 공백으로 구분하는 것

  예를 들어 push 1 이라면 push와 1을 구분해 생각한다

  spt[0] = push,   spt[1] = 1

 

 : 다른 명령어와 push는 조금 다르다

   다른 것들은 특정 문자를 출력하는 명령어지만 push는 출력이 아닌 입력만 존재한다

   즉 push 1 이라고 해서 1을 출력하는 것이 아닌 스택 안에 1을 입력만 하고 끝이다

   그래서 다른 명령어와 달리 push에는 bw.write()가 없다

 

 

                                                         

이제 풀어보러 갈께요 :)

 

 

https://www.acmicpc.net/problem/10828

 

10828번: 스택

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

www.acmicpc.net

 

 

*독학으로 익히는 코딩이라 틀린 것이 있을 수 있습니다. 오류가 있다면 댓글을 통해 알려주세요. 감사합니다. *