ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 백준 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
Designed by Tistory.