본문 바로가기

백준 풀이

백준 10866 - 덱

깃허브:

https://github.com/MSIQOC/BOJ/blob/master/b10866_%EB%8D%B1.java

 

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

 

10866번: 덱

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

www.acmicpc.net

일반적인 큐가 한쪽으로 삽입이 가능하고 다른 한쪽으로 빼내는 구조를 가진다면, 덱은 양쪽 방향으로 삽입과 빼내는 것이 다 가능한 구조를 가지고있다.

내가 덱을 구현하는 데에 생각한 알고리즘을 그림으로 그려봤다. 두 개의 스택을 이어붙인 구조를 생각했으며, front와 back을 나타내는 f와 b는 다음에 숫자를 삽입해야할 위치를 나타낸다. 명령의 수 최대가 10000이기 때문에 덱이 최대로 활용될 경우는 push_front를 만번 했을 경우나 push_back을 10000번 했을 경우이기 때문에 덱의 사이즈는 10000+10000 = 20000의 1차원 배열로 만들어주었다. 덱에 숫자가 몇개가 들어있는지는 b-f-1로 구할 수 있었다.

 

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
52
53
54
55
56
57
58
59
60
61
62
63
64
import java.io.*;
import java.util.*;
 
public class b10866_덱 {
    public static void main(String args[]) throws IOException {
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int f = 9999, b = 10000;  //맨 앞 수의 위치 f와 맨 뒤의 수의 위치 b. 10000과 10001로 잡는다.
        int d[] = new int[20000];  //맨 앞에 임의로 추가한 0번째 배열과 push_front 만번이나 push_back 만번이 배열을 최대로 쓸 경우이므로 10000+10000+1 = 20001 크기의 배열 생성.
        sc.nextLine();
        while (n-- > 0) {
            String s = sc.next();
            if(s.equals("push_front")) {
                int a = sc.nextInt();
                d[f] = a;            
                --f;
            }
            else if(s.equals("push_back")) {
                int a = sc.nextInt();
                d[b] = a;
                ++b;
            }
            else if(s.equals("pop_front")) {
                if(b-f-1 == 0)
                    bw.write("-1\n");
                else {
                    ++f;
                    bw.write(d[f]+"\n");
                }
            }
            else if(s.equals("pop_back")) {
                if(b-f-1==0)
                    bw.write("-1\n");
                else {
                    --b;
                    bw.write(d[b] + "\n");
                }
            }
            else if(s.equals("size")) {
                bw.write(b-f-1+"\n");
            }
            else if(s.equals("empty")) {
                if (b-f-1==0)
                    bw.write("1\n");
                else
                    bw.write("0\n");
            }
            else if(s.equals("front")) {
                if (b-f-1==0)
                    bw.write("-1\n");
                else
                    bw.write(d[f+1]+"\n");
            }
            else if(s.equals("back")) {
                if (b-f-1==0)
                    bw.write("-1\n");
                else
                    bw.write(d[b-1]+"\n");
            }
        }
        bw.flush();
    }
}
 
 

'백준 풀이' 카테고리의 다른 글

백준 9012 - 괄호  (0) 2021.01.10
백준 17413 - 단어뒤집기 2  (0) 2021.01.09
백준 9093 - 단어 뒤집기  (0) 2021.01.04
백준 10845-큐  (0) 2021.01.04
백준 10828번 - 스택  (0) 2021.01.04