반응형
https://www.acmicpc.net/problem/17413
17413번: 단어 뒤집기 2
문자열 S가 주어졌을 때, 이 문자열에서 단어만 뒤집으려고 한다. 먼저, 문자열 S는 아래와과 같은 규칙을 지킨다. 알파벳 소문자('a'-'z'), 숫자('0'-'9'), 공백(' '), 특수 문자('<', '>')로만 이루어져
www.acmicpc.net
하나의 문자열을 탐색하며 <와 >의 끝을 불린함수로 표시해주었고 공백으로도 끊어줬다.
내 코드
메모리 : 23808 KB
시간 : 276 ms
코드 길이 : 1328 B
[내 코드]
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Stack;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
Stack<Character> stack = new Stack<>();
boolean isSpecial = false;
String str = br.readLine();
for(int i = 0; i < str.length(); i++) {
if(str.charAt(i) == '<') {
isSpecial = true;
//<나오기 전의 문자열들을 뒤집어서 출력해줌
while(!stack.isEmpty())
sb.append(stack.pop());
//< 넣어주기
sb.append(str.charAt(i));
}
else if(str.charAt(i) == '>') {
isSpecial = false;
sb.append(str.charAt(i));
}
//<와 >의 사이에 존재하면 그대로 출력
else if(isSpecial)
sb.append(str.charAt(i));
//<와 >의 사이가 아니면
else if(!isSpecial) {
//공백이면
if(str.charAt(i) == ' ') {
//거꾸로 출력해줌
while(!stack.isEmpty())
sb.append(stack.pop());
sb.append(' ');
}
//공백이 아니면
else
stack.push(str.charAt(i));
}
}
while(!stack.isEmpty())
sb.append(stack.pop());
System.out.print(sb);
}
}
1등 코드
메모리 : 14200 B
시간 : 108 ms
코드길이 : 1119 B
[상위권 코드]
import java.io.*;
public class Main {
static BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
static char[] chars;
public static void main(String[] args) throws Exception {
chars = reader.readLine().toCharArray();
int idx = 0;
while (idx<chars.length) {
if (chars[idx] == '<') {
while(chars[idx++]!='>') {}
} else if (Character.isLetterOrDigit(chars[idx])) {
int start = idx;
while (idx < chars.length && chars[idx] != '<' && chars[idx] != ' ') {
idx++;
}
int end = idx-1;
reverse(chars, start, end);
if(idx<chars.length && chars[idx]!='<') {
idx++;
}
}
}
System.out.println(chars);
}
static void reverse(char[] chars, int start, int end) {
while (start<end) {
char tmp = chars[start];
chars[start] = chars[end];
chars[end] = tmp;
start++;
end--;
}
}
}
반응형
'백준 > 자료구조' 카테고리의 다른 글
[백준] 10816 : 숫자카드2 (JAVA) (1) | 2025.04.14 |
---|---|
[스택] 17299 : 오등큰수 (0) | 2023.04.12 |
[스택] 17298 : 오큰수 (0) | 2023.04.11 |
[백준] 스택 : 9093 (0) | 2023.04.06 |
[백준] 큐 - 10845 (0) | 2023.04.06 |