DY N DY

실력키우기 스택(JAVA) 본문

PARK/ALGORITHM

실력키우기 스택(JAVA)

손세지 2016. 4. 27. 15:33

1102 : 스택 (stack)

제한시간: 1Sec    메모리제한: 32mb
해결횟수: 1350회    시도횟수: 3002회   



Stack은 "더미"란 뜻을 가진다. 책 더미, 신문 더미 등에 사용하는 단어이다. 책 더미를 예로 들어 보자. 책 더미를 쌓았다고 했을 때, 이 책 더미에서 책을 가져오는 가장 정상적인 방법은 제일 위에 있는 책을 가져오는 방식이다.

다시 말하면 가장 먼저 들어간 책은 가장 나중에 꺼낼 수 있을 것이다. 이런식으로 자료가 사장 밑에 쌓이고(입력). 자료를 가져올 때(출력)는 가장 위(최근)의 자료를 가져오는 자료구조를 Stack하고 한다. 이러한 Stack의 특징 때문에 흔히 "FILO(First-In-Last-Out : 선입후출)" 혹은 "LIFO(Last-In-First-Out : 후입선출)"라고 한다.

그림과 같이 Stack을 설계하고 다음의 처리조건에 맞는 출력을 하시오.

 

e3050b66a1b29a01767400d7560a4131_1449727
 

 <처리조건>
주어진 명령은 다음의 3가지이다.
1. "i a"는 a라는 수를 스택에 넣는다. 이때, a는 10,000 이하의 자연수이다.
2. "o"는 스택에서 데이터를 빼고, 그 데이터를 출력한다. 만약 스택이 비어있으면, "empty"를 출력한다.
3. "c"는 스택에 쌓여있는 데이터의 수를 출력한다.

 

첫 줄에 N이 주어진다. N은 주어지는 명령의 수이다. (1≤N≤100)
둘째 줄부터 N+1줄까지 N개의 명령이 주어지는데, 한 줄에 하나씩 주어진다.



각 명령에 대한 출력 값을 한 줄에 하나씩 출력한다. 출력내용이 하나도 없는 경우는 주어지지 않는다.


 [Copy]
7
i 7
i 5
c
o
o
o
c
 [Copy]
2
5
7
empty
0


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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
/**************************************************************
    Problem: 1102
    User: a132034
    Language: Java
    Result: Success
    Time:142 ms
    Memory:9180 kb
****************************************************************/
 
 
import java.util.Scanner;
import java.util.Stack;
 
public class Main
{
    private static Scanner sc;
    public static int[] result;
    public static void main(String[] args) {
        sc = new Scanner(System.in);
         
        //stack;
        int st[] = new int[100];
        int top = 0;
        //명령의 수 입력
        int N = sc.nextInt();
        //명령
        String op;
        //입력할 수
        int n;
        sc.nextLine();
        for(int i = 0 ; i < N; ++i)
        {
            op = sc.nextLine();
            if('i' == (op.toCharArray()[0]))
            {
                st[top++] = Integer.parseInt(op.substring(2));
            }
            else if("o".equals(op))
            {
                if(top == 0)
                    System.out.println("empty");
                else
                    System.out.println(st[--top]);
            }
            else if("c".equals(op))
            {
                System.out.println(top);
            }
        }
    }
}



스택(stack)의 기본 개념만 알고 있다면 풀기에 어렵지 않은 문제다. 

보통 스택의 개념을 보면 top이 -1에서 시작하는데 0으로 쓴 것은 별 생각 없이 쓴 것.


여기서 30번째 line에 sc.nextLine()을 해준 이유는 :


위에서 nextInt를 받기 위해  예제 입력과 같은 7(숫자)을 입력받았다면 입력시 7을 입력하고 Enter를 누르기 때문에 실제 입력버퍼에는 7\n이 들어갈 것인데 nextInt는 이중 7만을 가져온다. 

입력버퍼에는 필연적으로 \n이 남아있게 되고, for문이 시작하며 33번째 line에서 사용자가 입력하지 않았음에도 이미 버퍼에 있는 \n을 라인의 끝으로 인식해 우리가 원하는 대로 입력받을 수가 없다. 

때문에 sc.nextLine()을 한번 사용해줌으로써 입력버퍼를 비워준다. 







'PARK > ALGORITHM' 카테고리의 다른 글

실력키우기 숫자의 개수(JAVA)  (0) 2016.04.28
실력키우기 문자열찾기(JAVA)  (0) 2016.04.28
실력키우기 이진탐색(JAVA)  (0) 2016.04.26
실력키우기 약수(C++)  (0) 2016.04.20
알고리즘 최소비용신장트리(JAVA)  (0) 2016.04.20