곽로그
[백준 17413, Java] 단어 뒤집기2 본문
문제
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
[자바] String, StringBuilder, StringBuffer의 차이
* String, StringBuffer, StringBuilder 차이점과 장단점. Java를 사용하면 종종 접하게 되는 문자열 클래스들입니다. (기술면접시 만나게 되는 문제 중 하나.) String, StringBuffer, StringBuilder.. 모두 문자..
12bme.tistory.com
[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 |