[백준]18258 큐2

서은경·2023년 2월 15일
0

CodingTest

목록 보기
56/71

문제 자체는 deque를 이용하면 너무 쉬웠는데 시간초과가 나서 어떻게 튜닝했는지 남겨보려고 포스팅한다!

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

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        Deque<Integer> dq = new LinkedList<>();
        int N = Integer.parseInt(br.readLine());

        for (int i = 0; i < N; i++) {
            StringTokenizer st = new StringTokenizer(br.readLine(), " ");
            String cmd = st.nextToken();
            if(st.hasMoreTokens()) {
                dq.add(Integer.valueOf(st.nextToken()));
            } else {
                if(cmd.equals("front")) {
                    if(!dq.isEmpty()) System.out.println(dq.peekFirst());
                    else System.out.println("-1");
                } else if(cmd.equals("back")) {
                    if(!dq.isEmpty()) System.out.println(dq.peekLast());
                    else System.out.println("-1");
                } else if(cmd.equals("empty")) {
                    if(!dq.isEmpty()) System.out.println("0");
                    else System.out.println("1");
                } else if (cmd.equals("size")) {
                    System.out.println(dq.size());
                } else if (cmd.equals("pop")) {
                    if(!dq.isEmpty()) System.out.println(dq.pop());
                    else System.out.println("-1");
                }
            }
        }
    }
}

기존 소스는 아무 생각없이 명령어를 " " 기준 토큰으로 잘라서 분기문 돌린 후 sout을 찍어줬는데 시간 초과가 났다.

자바 개발할 때도 system.out.println 을 지양하고 로깅 라이브러리를 통해 로그를 남겼는데 코테할 땐 왜 아무 생각없이 쓰게 되는지 모르겠다 !!!

System.out.println()을 호출하게 되면 디스크 I/O 동기화 처리가 되기 때문에 전체적인 시스템의 성능이 저하 될 수 있고, System.out.println() 으로 디버그 처리한 부분을 일일이 주석처리, 해제하는 것은 개발 및 운영의 효율을 떨어트릴 수 있다.

그렇게 해서 프린트문을 싹 지우고 StringBuilder로 성능을 높이고,
StringTokenizer 객체를 굳이 만들 필요없이 입력받은 명령어 자체만으로 분기를 탈 수 있게 수정했더니 성공했다 !!!

수정후 코드!

package baekjoon;

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

public class Main_18258 {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder sb = new StringBuilder();
        Deque<Integer> dq = new LinkedList<>();
        int N = Integer.parseInt(br.readLine());

        for (int i = 0; i < N; i++) {
            String cmd = br.readLine();
            if(cmd.equals("front")) {
                if(!dq.isEmpty()) sb.append(dq.peekFirst()+"\n");
                else sb.append("-1"+"\n");
            } else if(cmd.equals("back")) {
                if(!dq.isEmpty()) sb.append(dq.peekLast()+"\n");
                else sb.append("-1"+"\n");
            } else if(cmd.equals("empty")) {
                if(!dq.isEmpty()) sb.append("0"+"\n");
                else sb.append("1"+"\n");
            } else if (cmd.equals("size")) {
                sb.append(dq.size()+"\n");
            } else if (cmd.equals("pop")) {
                if(!dq.isEmpty()) sb.append(dq.pop()+"\n");
                else sb.append("-1"+"\n");
            } else {
                dq.add(Integer.valueOf(cmd.split(" ")[1]));
            }
        }
        System.out.println(sb);
    }
}

또 하나 배워간다 ~ ~ ~

0개의 댓글

관련 채용 정보