티스토리 뷰

Solved.ac Class 완전정복 프로젝트

Class : 2 ~ 2 ++

 

 


링크

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

 

10828번: 스택

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

www.acmicpc.net

 

 

문제

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

명령은 총 다섯 가지이다.

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

 

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

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

 

 

접근방법

 이 문제는 스택의 기본을 아는지 모르는지에 대한 내용이다. LIFO 구조를 알고 있고 있는지, 그리고 해당 입력에 맞게 그것을 처리할 수 있는지 묻는 문제이다. 이 점을 기억하고 풀으로 접근하자. 

 

실패 원인

 나는 시간 초과로 이 문제를 틀렸다. 아무래도 Scanner와 StringTokenizer를 통해 데이터를 분리하고 실행한 부분이 원인으로 짐작된다. BufferedReader로 교체 후 정상적으로 성공으로 바뀌었다. 실패 코드는 더보기란에 넣어 두었으니, 보실 분들은 참고 바란다.

 

더보기

시간초과로 인한 실패코드

 

import java.util.Scanner;
import java.util.Stack;
import java.util.StringTokenizer;

public class Main {
    Stack<Integer> results = new Stack<>();
    public static void main(String[] args) {
        Main test = new Main();
    }

    public Main(){
        Scanner sc = new Scanner(System.in);
        int tc = sc.nextInt();
        sc.nextLine();

        for (int i = 0 ; i < tc ; i++){
            String input = sc.nextLine();
            StringTokenizer stringTokenizer = new StringTokenizer(input," ");
            String command = stringTokenizer.nextToken();
            int data = 0;
            if(stringTokenizer.hasMoreTokens()) {
                data = Integer.parseInt(stringTokenizer.nextToken());
            }
            //System.out.println(command + " : " + data);
            solution(command,data);
        }


    }

    public void solution (String command,int data){
        if (command.equals("push")){
            results.push(data);
        }else if(command.equals("pop")){
            if(results.isEmpty()){
                System.out.println(-1);
            }else{
                System.out.println(results.pop());
            }
        }else if(command.equals("top")){
            if(results.isEmpty()){
                System.out.println(-1);
            }else{
                System.out.println(results.peek());
            }
        }else if(command.equals("size")){
            System.out.println(results.size());
        }else if(command.equals("empty")){
            if(results.isEmpty()){
                System.out.println(1);
            }else{
                System.out.println(0);
            }
        }
    }


}

 

 

풀이 방법

 스택에 대해 간단히 설명하자면, 다음과 같다.

stack의 push 와 pop

 스택은 후입 선출의 구조를 가지며, push라는 메서드를 통해 삽입, pop이라는 메소드를 통해 top에 있는 데이터를 뺀다.

메서드에 대한 설명들은 아래의 api를 참고 바란다.

 

Stack (Java Platform SE 7 )

The Stack class represents a last-in-first-out (LIFO) stack of objects. It extends class Vector with five operations that allow a vector to be treated as a stack. The usual push and pop operations are provided, as well as a method to peek at the top item o

docs.oracle.com

 

 한 줄씩 입력을 받아, 문자열과 숫자를 분리해야 한다. Push를 제외한 명령어는 뒤에 정수형 데이터가 붙지 않으므로, 길이를 통해 분기를 나눠주어야 한다. 그렇지 않으면, arrayIndex 런타임 에러가 발생할 것이다. 나머지 부분들은 해당 명령어에 대해 stack이 가지고 있는 부분들을 사용하면 된다.

 

 

코드

 

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

public class Main {
    
    Stack<Integer> results = new Stack<>();
    public static void main(String[] args) throws IOException {
        Main test = new Main();
    }

    public Main() throws IOException {
        BufferedReader br =new BufferedReader(new InputStreamReader(System.in));
        int tc = Integer.parseInt(br.readLine());
        
        
        //command 와 data를 분리
        for (int i = 0 ; i < tc ; i++){
            String[] input = br.readLine().split(" ");
            String command = input[0];

            int data = 0;
            
            //push를 제외한 경우, 데이터가 없으므로 막아줘야함
            if(input.length > 1) {
                data = Integer.parseInt(input[1]);
            }
            
            solution(command,data);

        }

    }

    public void solution (String command,int data){
        
        //command별 기능 수행
        if (command.equals("push")){
            results.push(data);
        }else if(command.equals("pop")){
            if(results.isEmpty()){
                System.out.println(-1);
            }else{
                System.out.println(results.pop());
            }
        }else if(command.equals("top")){
            if(results.isEmpty()){
                System.out.println(-1);
            }else{
                //peek() : top의 data를 보여줌 
                System.out.println(results.peek());
            }
        }else if(command.equals("size")){
            System.out.println(results.size());
        }else if(command.equals("empty")){
            if(results.isEmpty()){
                System.out.println(1);
            }else{
                System.out.println(0);
            }
        }
    }

}

 

 

결과

 

 


포스팅에 문제가 있거나, 설명이 잘못된 부분 지적 환영합니다.

더 나은 퀄리티의 콘텐츠를 제공할 수 있도록 노력하겠습니다.

읽어주셔서 감사합니다. 

 

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함