곽로그

[백준 17413, Java] 단어 뒤집기2 본문

알고리즘/백준

[백준 17413, Java] 단어 뒤집기2

일도이동 2020. 10. 28. 12:58
반응형

문제 

www.acmicpc.net/problem/17413

 

17413번: 단어 뒤집기 2

문자열 S가 주어졌을 때, 이 문자열에서 단어만 뒤집으려고 한다. 먼저, 문자열 S는 아래와과 같은 규칙을 지킨다. 알파벳 소문자('a'-'z'), 숫자('0'-'9'), 공백(' '), 특수 문자('<', '>')로만 이루어져

www.acmicpc.net

check

1. String과 StringBuilder

- 처음에는 String을 사용해서 구현을 했는데 시간초과가 났다. 시간복잡도를 계산했을 때, 모든 문자열이 스택에 push 되었다가 pop되니까 O(2N)이라고 생각했다. 그래서 시간초과가 나는게 의아했다.

- String을 사용했을때에 문제는 String을 이용한 연산때문에 시간초과가 난다는 거다. String에대한 연산이 많을 때는 StringBuilder나 StringBuffer를 사용해야한다. 

 

2. Java9 Java11

- String과 StringBuffere 의 실행시간이 궁금해서 System.currentTimeMills()를 찍어봤는데 String이 더 빠르게 나왔다. 

그래서 Java8로 채점되어있던걸 Java11로 바꾸니 시간초과가 안난다. 

 

cjh5414.github.io/why-StringBuffer-and-StringBuilder-are-better-than-String/

 

StringBuffer, StringBuilder 가 String 보다 성능이 좋은 이유와 원리

Jihun's Development Blog

cjh5414.github.io

12bme.tistory.com/42

 

[자바] String, StringBuilder, StringBuffer의 차이

* String, StringBuffer, StringBuilder 차이점과 장단점. Java를 사용하면 종종 접하게 되는 문자열 클래스들입니다. (기술면접시 만나게 되는 문제 중 하나.) String, StringBuffer, StringBuilder.. 모두 문자..

12bme.tistory.com

 

ifuwanna.tistory.com/221

 

[Java] String, StringBuffer, StringBuilder 차이 및 장단점

Java 에서 문자열을 다루를 대표적인 클래스로 String , StringBuffer, StringBuilder 가 있습니다. 연산이 많지 않을때는 위에 나열된 어떤 클래스를 사용하더라도 이슈가 발생할 가능성은 거의 없습니다

ifuwanna.tistory.com

코드

1. String 사용(시간 초과)

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.Stack;

public class Main {
    public static void main(String[] args) throws Exception{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        Stack<Character> stack = new Stack<>();

        String line = br.readLine()+" ";
        int index = 0;
        String inverseWord ="";
        while(index<line.length()){
            char alphabet = line.charAt(index);
            if(line.charAt(index)=='<'){
                if(stack.isEmpty()){
                    while(line.charAt(index)!='>'){
                        inverseWord+=Character.toString(line.charAt(index++));
                    }
                }
                else{
                    while(!stack.isEmpty()) {
                        inverseWord += Character.toString(stack.pop());
                    }
                }
            }
            else if(line.charAt(index)=='>'){
                inverseWord+=Character.toString(line.charAt(index++));
            }
            else if(line.charAt(index)==' '){
                if(!stack.isEmpty()){
                    while(!stack.isEmpty()){
                        inverseWord+=Character.toString(stack.pop());
                    }
                    inverseWord+=" ";
                }
                index++;
            }
            else{
                stack.push(line.charAt(index++));
            }
        }

        System.out.println(inverseWord);

    }
}

 

 

 

2. StringBuilder

 

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.Stack;

public class Main {
    public static void main(String[] args) throws Exception{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        Stack<Character> stack = new Stack<>();

        String line = br.readLine()+" ";
        int index = 0;
        StringBuilder inverseWord =new StringBuilder();
        while(index<line.length()){
            char alphabet = line.charAt(index);
            if(line.charAt(index)=='<'){
                if(stack.isEmpty()){
                    while(line.charAt(index)!='>'){
                        inverseWord.append(Character.toString(line.charAt(index++)));
                    }
                }
                else{
                    while(!stack.isEmpty()) {
                        inverseWord.append(Character.toString(stack.pop()));
                    }
                }
            }
            else if(line.charAt(index)=='>'){
                inverseWord.append(Character.toString(line.charAt(index++)));
            }
            else if(line.charAt(index)==' '){
                if(!stack.isEmpty()){
                    while(!stack.isEmpty()){
                        inverseWord.append(Character.toString(stack.pop()));
                    }
                    inverseWord.append(" ");
                }
                index++;
            }
            else{
                stack.push(line.charAt(index++));
            }
        }

        System.out.println(inverseWord);

    }
}
반응형

'알고리즘 > 백준' 카테고리의 다른 글

[백준 17298, Java] 오큰수  (0) 2020.10.31
[백준 10799, Java] 쇠막대기  (0) 2020.10.28
[백준 1406, Java] 에디터  (0) 2020.10.28
[백준 10820, Java] 문자열 분석  (0) 2020.10.27
[백준 1935, Java] 후위표기식2  (0) 2020.10.26
Comments