반응형
https://www.acmicpc.net/problem/9093
9093번: 단어 뒤집기
첫째 줄에 테스트 케이스의 개수 T가 주어진다. 각 테스트 케이스는 한 줄로 이루어져 있으며, 문장이 하나 주어진다. 단어의 길이는 최대 20, 문장의 길이는 최대 1000이다. 단어와 단어 사이에는
www.acmicpc.net
입력을 어떻게 해야 할지 굉장히 헤맸다.
stack을 사용해야 하는 건 알겠는데 한 줄을 반대로 하는 게 아니라 단어를 반대로 해야 하는 거여서 어떻게 끊을지 고민함.
끝에 '\n'를 추가한 한 줄을 모두 String으로 입력한 후에 Character 타입의 스택에 ' '와 '\n'를 만나면 모두 pop 아니면 push를 해주며 반복했다.
메모리 : 72032 KB
시간 : 720 ms
코드길이 : 915 B
[내 코드]
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.Stack;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringBuilder sb;
int T = Integer.parseInt(br.readLine());
for(int t = 0; t < T; t++) {
sb = new StringBuilder();
String str = br.readLine() + '\n';
Stack<Character> stack = new Stack<>();
for(int i = 0; i < str.length(); i++) {
if(str.charAt(i) == ' ' || str.charAt(i) == '\n') {
while(!stack.empty()) {
sb.append(stack.pop());
}
sb.append(" ");
}
else
stack.push(str.charAt(i));
}
bw.write(sb + "\n");
}
bw.close();
}
}
1등 코드
메모리 : 24732 KB
시간 : 200 ms
코드 길이 : 765 B
[상위권 코드]
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
public class Main {
public static void main(String[] args) {
/*int test = '\n';
System.out.println((char)test+":"+test);*/ // => 결과: 10
char[] stack = new char[20];
int top=0;
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
try {
// int n = Integer.parseInt(br.read()); 는 사용불가
// br.read()가 이미 int(ascii char형)를 반환하기 때문에. 그렇다고 그냥 br.read() 출력하면 숫자의 ascii값을 출력해준다.
int n = Integer.parseInt(br.readLine());
for(int i=0; i<n; ++i) {
int c;
while(true) {
c = br.read();
// 띄어쓰기 만나면 출력
if(c == ' ' || c == '\n') {
while(top != 0) {
bw.write(stack[--top]);
}
// 스택 출력 후에 띄어쓰기랑 뉴라인 버퍼에 저장
if(c == ' ') bw.write(' ');
if(c == '\n') {
bw.write('\n');
break;
}
} else if(c == '\r') {
// @ 윈도우에서 개행은 캐리지리턴(CRLF, \r\n)이다!
}else {
// 스택에 띄어쓰기, 뉴라인 전부 넣으면 띄어쓰기부터 시작함(스택)
stack[top++] = (char)c;
}
// System.out.println((char)c + ":" + c); // => 결과: 문장 끝에 13
}
}
bw.flush();
} catch(Exception e) {
e.printStackTrace();
}
}
}
반응형
'백준 > 자료구조' 카테고리의 다른 글
[스택] 17413 : 단어 뒤집기 2 (0) | 2023.04.11 |
---|---|
[스택] 17298 : 오큰수 (0) | 2023.04.11 |
[백준] 큐 - 10845 (0) | 2023.04.06 |
[백준] 스택 - 1406 (0) | 2023.04.05 |
[백준] 스택 - 10828 (0) | 2023.04.05 |