더 많이 실패하기

공부 80일차: 백준 10845번 큐 자바 Java 본문

알고리즘/백준

공부 80일차: 백준 10845번 큐 자바 Java

김발자~ 2022. 10. 18. 23:27
반응형

10845 큐

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

 

10845번: 큐

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

www.acmicpc.net

 

 

 


백준 10845번 문제 큐


문제


 

 

 

 


과정 생각해보기


 

https://gimbalja.tistory.com/149

저번에 switch를 이용한 스택 문제랑 완전 비슷한 문제

 

대신 저 문제처럼 큐를 구현하기보다 큐를 직접 사용해도 될 것 같았다

(pop이 맨 앞을 꺼내기 때문 - Queue를 구현하는 LinkedList에 있는 poll, peek 등)

 

 

 


정답 인정 코드


 

(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
65
66
67
68
69
70
71
72
73
74
75
76
77
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;
 
public class Main {
    static Queue q = new LinkedList();
 
    public static void main(String[] args) throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder sb = new StringBuilder();
        
        int n = Integer.parseInt(br.readLine());
        
        int last = 0;
        for(int i = 0; i < n; i++) {
            StringTokenizer st = new StringTokenizer(br.readLine());
            String str = st.nextToken();
            
            switch(str) {
                case "push":
                    last = Integer.parseInt(st.nextToken());
                    q.offer(last);
                    break;
                case "pop":
                    sb.append(pop()).append("\n");
                    break;
                case "size":
                    sb.append(q.size()).append("\n");
                    break;
                case "empty":
                    sb.append(empty()).append("\n");
                    break;
                case "front":
                    sb.append(front()).append("\n");
                    break;
                case "back":
                    if(q.isEmpty())
                        sb.append(-1).append("\n");
                    else
                        sb.append(last).append("\n");
                    break;
            }
        }
        
        System.out.println(sb);
        
    }
    
    static int pop() {
        if(q.isEmpty())
            return -1;
        else {
            return (int)q.poll();    //첫번째 요소 반환 후 제거
        }
    }
    
    static int empty() {
        if(q.isEmpty())
            return 1;
        else
            return 0;
    }
    
    static int front() {
        if(q.isEmpty())
            return -1;
        else
            return (int)q.peek();    //첫번째 요소 반환
    }
    
    
 
}
 
cs

 

성공했지만 메서드 반 메인메서드 안에 구현 반이라서 지저분해보였다

 

 

(2)

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
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;
 
public class Main {
 
    public static void main(String[] args) throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder sb = new StringBuilder();
        
        Queue q = new LinkedList<>();
        
        int n = Integer.parseInt(br.readLine());
        
        int last = 0;
        for(int i = 0; i < n; i++) {
            StringTokenizer st = new StringTokenizer(br.readLine());
            String str = st.nextToken();
            
            switch(str) {
                case "push":
                    last = Integer.parseInt(st.nextToken());
                    q.offer(last);
                    break;
                case "pop":
                    if(q.isEmpty())
                        sb.append(-1).append("\n");
                    else
                        sb.append(q.poll()).append("\n");
                    break;
                case "size":
                    sb.append(q.size()).append("\n");
                    break;
                case "empty":
                    if(q.isEmpty())
                        sb.append(1).append("\n");
                    else
                        sb.append(0).append("\n");
                    break;
                case "front":
                    if(q.isEmpty())
                        sb.append(-1).append("\n");
                    else
                        sb.append(q.peek()).append("\n");
                    break;
                case "back":
                    if(q.isEmpty())
                        sb.append(-1).append("\n");
                    else
                        sb.append(last).append("\n");
                    break;
            }
        }
        
        System.out.println(sb);
        
    }
    
 
}
cs

 

Queue도 지역변수로 바꾸고 모두 메인 메서드 안에서 해결

미세하긴 하지만 시간도 4ms 더 빨랐다

 

메서드로 따로 빼는 게 코딩 관점에선 더 좋을 것 같긴 한데(얘도 추측) 이건 한 문제 내에서의 통일성을 생각했다

 

 

 


이제 계속 바빠서 블로그에 기록하는 공부량이 확 줄어들 것 같다

그래도 계속 공부는 열심히 하는 중

반응형
Comments