본문 바로가기

PROGRAMMING/ALGORITHM

[백준] 10799번 JAVA

처음 제출햇던 버전

import java.io.*;
import java.util.Queue;
import java.util.Stack;
import java.util.concurrent.ArrayBlockingQueue;

public class Main {
    public static void main(String args[]) throws IOException, InterruptedException {
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(System.out));
        String[] input = reader.readLine().split("");
        int output = 0;
        Stack<String> stickStack = new Stack<>();

        for(int i = 0; i < input.length; i++){
            String nowStr = input[i];
            String nxtStr = input[Math.min(i+1, input.length-1)];
//            열린 괄호가 나오면 다음 문자가 닫힌 괄호인지 체크하고(두개가 세트이기 때문에)
//            다음 문자가 닫힌 괄호이면 stack 사이즈만큼 더해준 후 다음 문자 턴은 스킵
            if(nowStr.equals("(") && nxtStr.equals(")")){
                output += stickStack.size();
                i++;
            }else if(nowStr.equals("(")){
//                단독 열린 괄호 = 쇠막대기 추가임으로 스택에 push
                stickStack.push(nowStr);
            }else if(nowStr.equals(")")){
//                닫힌 괄호는 쇠막대기 끝을 의미, pop후 나머지 꼬다리를 더해주기위해 ++
                stickStack.pop();
                output++;
            }
        }

        writer.write(output + "\n");
        reader.close();
        writer.flush();
        writer.close();
    }
}

 

찾아보니까 좀더 빠르고 메모리 덜 잡아 먹는 코드가 있어서

비교해보니

1.일단 writer없이 그냥 sout으로 출력

2.String배열 대신 Character 배열 사용

 

수정본

import java.io.*;
import java.util.Queue;
import java.util.Stack;
import java.util.concurrent.ArrayBlockingQueue;

public class Main {
    public static void main(String args[]) throws IOException, InterruptedException {
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        char[] input = reader.readLine().toCharArray();
        int output = 0;
        Stack<Character> stickStack = new Stack<>();

        for(int i = 0; i < input.length; i++){
            char nowStr = input[i];
            char nxtStr = input[Math.min(i+1, input.length-1)];
//            열린 괄호가 나오면 다음 문자가 닫힌 괄호인지 체크하고(두개가 세트이기 때문에)
//            다음 문자가 닫힌 괄호이면 stack 사이즈만큼 더해준 후 다음 문자 턴은 스킵
            if(nowStr == '(' && nxtStr == ')'){
                output += stickStack.size();
                i++;
            }else if(nowStr == '('){
//                단독 열린 괄호 = 쇠막대기 추가임으로 스택에 push
                stickStack.push(nowStr);
            }else if(nowStr == ')'){
//                닫힌 괄호는 쇠막대기 끝을 의미, pop후 나머지 꼬다리를 더해주기위해 ++
                stickStack.pop();
                output++;
            }
        }

        System.out.println(output + "\n");
        reader.close();
    }
}

메모리 시간 다 딱 1/3씩 줄었다.

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

[백준] 17299번 오등큰수 JAVA  (0) 2021.04.13
[백준] 17298번 JAVA  (0) 2021.04.11
[백준] 17413번 JAVA  (0) 2021.04.01
[백준] 1158번 JAVA 요세푸스  (0) 2021.03.31
[백준] 1406번 JAVA  (0) 2021.03.30