-
백준 9093 - 단어뒤집기자료구조와 알고리즘/문제풀기 2023. 4. 4. 20:01
문장이 주어지면, 단어를 뒤집어야한다.
입력:첫째 줄에 테스트 케이스의 개수 T가 주어진다. 각 테스트 케이스는 한 줄로 이루어져 있으며, 문장이 하나 주어진다. 단어의 길이는 최대 20, 문장의 길이는 최대 1000이다. 단어와 단어 사이에는 공백이 하나 있다.
출력:각 테스트 케이스에 대해서, 입력으로 주어진 문장의 단어를 모두 뒤집어 출력한다.
예제입력
2 I am happy today We want to win the first prize
예제출력
I ma yppah yadot eW tnaw ot niw eht tsrif ezirp
-해결 방법
1. 테스트케이스 입력받기 & 문자열 입력받기
2. 공백으로 단어가 구분되어 있으므로, 공백까지 문자를 저장했다가 공백을 만나면 뒤집어서 출력
*개행문자도 공백으로 간주해서 개행문자를 만났을 때도, 뒤집어서 출력해줘야한다.
->자료구조 선택
-스택 : 뒤집는다는 것 자체가 LIFO구조
내 풀이 1
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)); int t = Integer.valueOf(br.readLine()); Stack Sstack = new Stack<>(); char input; while(t-->0){ //스택에 단어 집어넣기 while((input = (char)br.read()) != '\n'){ if(input == ' '){ while(!Sstack.empty()){ bw.write((char)Sstack.pop()); } bw.write(' '); }else Sstack.push(input); } //남은 단어처리 while(!Sstack.empty()){ bw.write((char)Sstack.pop()); } bw.write('\n'); } bw.flush(); bw.close(); } }
문자열을 char[]로 다루려고 시도 했었다. 근데 저런식으로 다루면 문제가 문장의 끝과 단어의 끝이 개행으로 같아서
문장이 끝났을 때, 스택에 남아있는 단어를 다시 꺼내줘야하는 코드의 중복이 발생했다.
풀이 2
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)); int t = Integer.valueOf(br.readLine()); Stack Sstack = new Stack<>(); String input; while (t -- >0){ input = br.readLine()+"\n"; //한 줄 읽고 + '\n' for(char i: input.toCharArray()){ if( i == ' ' || i == '\n') { //공백이나 개행시 -> 출력 while (!Sstack.empty()) { bw.write((char) Sstack.pop()); } bw.write(i); } else Sstack.push(i); //아니면 스택에 단어 넣기 } } bw.flush(); bw.close(); } }
그러므로 위와 같이 되도록 문자열을 중심으로 입력을 받고, 이를 char[]로 바꾸어서 적절히 처리하는 것이 훨씬 편하다.
이때 readLine()은 개행문자는 무시 -> 처리에 있어서 개행문자가 의미가 있다면, 따로 추가해두자.
*배운점
-스택의 간단한 활용
-문자열을 중심으로 입력을 받고 char[]로 변환해서 사용하는 것이 훨씬 편한듯하다.
read()
문자열 다룰 때 자바 eof (입력,파일 스트림으로부터 모두 읽기)
while((input=readLine()) !=null)
while((input=read()) !=-1)
while(scanner.hasNext())
'자료구조와 알고리즘 > 문제풀기' 카테고리의 다른 글
백준 10845 - 큐 구현 (0) 2023.04.05 백준 1406 - 에디터 (0) 2023.04.05 백준 1874 - 스택수열 (0) 2023.04.04 백준 9012 - 괄호 (0) 2023.04.04 백준 10828 - 스택 구현 (0) 2023.04.04