코딩테스트/BOJ

[BOJ] 18258 큐2 - JAVA

5월._. 2022. 2. 6.
728x90

1. 문제


2. 풀이

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.StringTokenizer;

public class BOJ_18258_큐2 {
    public static void main(String[] args) throws IOException {
        BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
        int N = Integer.parseInt(in.readLine());

        LinkedList<Integer> queue = new LinkedList<>();

        StringBuilder sb = new StringBuilder();
        StringTokenizer st;

        while (N-- > 0) {
            st = new StringTokenizer(in.readLine());
            switch (st.nextToken()) {
                case "push":
                    queue.add(Integer.parseInt(st.nextToken()));
                    break;
                case "pop":
                    if(queue.isEmpty()) sb.append("-1\n");
                    else sb.append(queue.poll()).append("\n");
                    break;
                case "size":
                    sb.append(queue.size()).append("\n");
                    break;
                case "empty":
                    if(queue.isEmpty()) sb.append("1\n");
                    else sb.append("0\n");
                    break;
                case "front":
                    if(queue.isEmpty()) sb.append("-1\n");
                    else sb.append(queue.peek()).append("\n");
                    break;
                case "back":
                    if(queue.isEmpty()) sb.append("-1\n");
                    else sb.append(queue.get(queue.size()-1)).append("\n");
                    break;

            }
        }
        System.out.print(sb);
    }
}

큐 문제였지만 Queue를 이용하지 않고 LinkedList를 Queue처럼 사용했다. "back" 명령 때문에 get함수가 필요했기 때문이다. Deque을 사용할까 생각도 해봤지만 어차피 Queue를 LinkedList로 구현하고 있어서 그 부분만 수정했다. (쓰면서 생각해보니 Deque으로 바꿔도 코드 한줄만 수정하면 됐겠다...)  


3. 결과

아래는 예전에 짠 코드. 다른 건 모두 동일하고 이 부분만 다르다.

sb.append(queue.poll()).append("\n");

위△가 지금 코드, 아래▽가 예전 코드. 이 코드 한 줄 차이로 메모리와 시간이 아주 미세하게 차이가 난다. 

 

sb.append(queue.poll()+"\n");

 

알게된 점(String의 +연산, StringBuilder의 append 비교)

찾아보니 String의 +연산은 메서드 내부에서 StringBuilder를 사용하기 시작하면서(JDK 1.5~) 성능이 그 전보다 나아졌지만, 여전히 +연산을 할 때마다 새로운 StringBuilder 객체를 생성하기 때문에 내가 직접 StringBuilder를 사용하는 것보다 느리다. 

저번에 알아본 결과 append함수가 arraycopy를 이용했기 때문에 간단하게 +연산하는 것보다 더 느릴 거라고 생각했는데 완전히 반대의 결과라서 신기하다. 

[이 글]에 정리했다.

 

4. 참고한 글

https://madplay.github.io/post/difference-between-string-stringbuilder-and-stringbuffer-in-java

'코딩테스트 > BOJ' 카테고리의 다른 글

[BOJ] 11866 요세푸스 문제 0 - JAVA  (0) 2022.02.06
[BOJ] 2164 카드2 - JAVA  (0) 2022.02.06
[BOJ] 17298 오큰수 - JAVA  (0) 2022.02.05
[BOJ] 1874 스택수열 - JAVA  (0) 2022.02.05
[BOJ] 4949 균형잡힌 세상 - JAVA  (0) 2022.02.05

댓글