[JAVA] 28278 스택2 & StringBuilder

공부기록·2024년 2월 17일
0
post-thumbnail

  • 간단하게 Stack을 사용하는 문제라고 생각했는데 시간초과가 떴다. Scanner 안쓰고 Buffer 쓰면 안나는 줄 알았는데 아닌가보다..

  • 시간 초과 뜬 코드
public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        Stack<Integer> stack = new Stack<>();
        int temp = 0;

        temp = parseInt(st.nextToken());
        for(int i = 0; i < temp; i++){
            st = new StringTokenizer(br.readLine());
            int method = parseInt(st.nextToken());
            switch(method){
                case 1:
                    int num = parseInt(st.nextToken());
                    stack.push(num);
                    break;
                case 2:
                    if(stack.isEmpty()){
                        System.out.println(-1);
                        break;
                    }
                    System.out.println(stack.pop());
                    break;
                case 3:
                    System.out.println(stack.size());
                    break;
                case 4:
                    if(stack.isEmpty()){
                        System.out.println(1);
                        break;
                    }
                    System.out.println(0);
                    break;
                case 5:
                    if(stack.isEmpty()) {
                        System.out.println(-1);
                        break;
                    }
                    System.out.println(stack.peek());
                    break;
            }
        }

    }
}

  • 찾아보니 System.out.println()보다 StringBuilder를 쓰는게 연산 수를 줄여줄 수 있다고한다.

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        StringBuilder sb = new StringBuilder();
        Stack<Integer> stack = new Stack<>();
        int temp = 0;

        temp = parseInt(st.nextToken());
        for(int i = 0; i < temp; i++){
            st = new StringTokenizer(br.readLine());
            int method = parseInt(st.nextToken());
            switch(method){
                case 1:
                    int num = parseInt(st.nextToken());
                    stack.push(num);
                    break;
                case 2:
                    if(stack.isEmpty()){
                        sb.append(-1).append('\n');
                        break;
                    }
                    sb.append(stack.pop()).append('\n');
                    break;
                case 3:
                    sb.append(stack.size()).append('\n');
                    break;
                case 4:
                    if(stack.isEmpty()){
                        sb.append(1).append('\n');
                        break;
                    }
                    sb.append(0).append('\n');
                    break;
                case 5:
                    if(stack.isEmpty()) {
                        sb.append(-1).append('\n');
                        break;
                    }
                    sb.append(stack.peek()).append('\n');
                    break;
            }

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

  • 생각보다 신경써야하는 부분이 많은 것 같다... System.out.println()도 연산횟수에 포함된다는 사실을 간과했다. 이젠 StringBuilder의 사용을 지향해야겠다.

StringBuilder

  • String과 비슷하게 메소드에서 index를 이용한다. 그리고 추가하는 타입을 생각보다 많이 지원해준다. String, int, char등 다 지원해주는 듯.

StringBuilder sb = new StringBuilder();

sb.append(T t);
sb.insert(int index, T t); //index에 해당 객체 추가
sb.substring();
sb.deleteCharAt(int index);
sb.toString();
sb.length();
sb.reverse();
sb.setChar(int index, T t);
sb.setLength(int length); //length만큼만 남겨버린다.

0개의 댓글

관련 채용 정보