[백준] 9093번 단어 뒤집기 JAVA (자바) 풀이
문제 9093번
: 문장의 단어를 모두 뒤집어서 출력하는 프로그램을 작성하시오. (단, 단어의 순서는 바꿀 수 X)
[입력]
: 첫째 줄에 테스트 케이스 개수 T가 주어진다
: 각 테스트 케이스는 한 줄로 이루어져 있다 (문장이 하나)
: 단어와 단어 사이에는 공백이 하나 있다
: 예) I love you
[출력]
: 주어진 문장의 단어를 모두 뒤집어 출력
: 예) I evol uoy
[스택 연산]
init() | 스택을 초기화 |
create() | 스택을 생성 |
is_empty(s) | 스택이 비어있는지 검사 |
is_full(s) | 스택이 가득 찼는지 검사 |
push(e) | 스택의 맨 위에 요소 e 추가 |
pop(s) | 스택의 맨 위 요소를 삭제 |
peek(s) | 스택의 맨 위 요소를 삭제하지 않고 반환 |
top() | 스택 맨 위에 있는 데이터 값 반환 |
push() | 스택에 데이터 삽입 |
pop() | 스택에서 데이터 삭제하여 반환 |
isEmpty() | 스택에 원소가 없으면 'True', 있으면 'False' 값 반환 |
isFull() | 스택에 원소가 없으면 'False', 있으면 'True' 값 반환 |
[코드]
import java.util.*;
import java.io.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int t = Integer.parseInt(br.readLine());
Stack<Character> stack = new Stack<>();
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
while(t-- > 0) {
String s = br.readLine()+"\n";
for(char c : s.toCharArray()) {
if(c == ' ' || c == '\n') {
while(!stack.isEmpty()) {
bw.write(stack.pop());
}
bw.write(c); // 공백
} else
stack.push(c);
}
}
bw.flush();
}
}
[해설]
: Stack<Character> stack = new Stack<>(); 으로 스택선언
문자 하나씩 볼 때엔 Character로 선언
: for(a:b) 는 b에 a를 담는 것
즉 for(char c : s.toCharArray())
= s.toCharArray에 char c 를 담는 것 = 문자열 s 배열에 문자 c를 추가한다
* toCharArray()
= String 문자열을 char 문자로 쪼개서 순서대로 배열에 넣어주는 매서드
: if(c == ' ' || c == '\n') 는 문자에 공백이나 줄바꿈이 있으면 아래 명령을 수행한다
: !stack.isEmpty()는 스택이 비어있지 않을 때 수행 (즉 비어있을때까지 반복)
: bw.write(stack.pop());
pop은 선입후출이므로 거꾸로 문자가 나간다
ex) l-o-v-e입력, 출력은 e-v-o-l이다
: bw.write(c);
여기서 부터는 while문이 끝났다 스택이 비었다는 것 = 공백
공백은 공백대로 출력한다
: stack.push(c);
그 다음 공백 만나기전까지 다음 문자들을 스택에 넣어주기
이제 풀어보러 갈께요 :)

9093번: 단어 뒤집기
첫째 줄에 테스트 케이스의 개수 T가 주어진다. 각 테스트 케이스는 한 줄로 이루어져 있으며, 문장이 하나 주어진다. 단어의 길이는 최대 20, 문장의 길이는 최대 1000이다. 단어와 단어 사이에는
www.acmicpc.net
* 독학으로 익히는 코딩이라 틀린 것이 있을 수 있습니다. 오류가 있다면 댓글을 통해 알려주세요. 감사합니다. *