단어 뒤집기

이번 포스팅 문제는 9093번 문제입니다. 이 문제는 스택의 성질을 이용하여 풀이하였습니다.

스택은 LIFO(Last In First Out) 성질 즉, 마지막 넣은 요소를 처음으로 얻을 수 있다는 것입니다. 자 이 성질을 염두에 두고 문제를 풀어보도록 하겠습니다.


문제요약

주어진 문장에서 단어(띄어쓰기로 구분)단위로 단어를 뒤집으면서 출력하는 문제입니다. 예를 들어
"I am happy today" 는 4개의 단어 I, am, happy, today로 나누어지고 이 4단어를 각각 역순으로 출력하면 "I ma yppah yadot" 이 출력됩니다.

풀이전략

  1. 주어진 문장을 Charactor형 공백을 포함한 배열로 변환합니다.
  2. 배열을 순회하면서 만난 요소가 공백이 아니라면 스택에 추가를, 공백 또는 문장의 마지막을 나타낸다면 스택의 내용을 모두 출력합니다.

구현하기

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
package BackJoon;
 
import java.io.IOException;
import java.util.Scanner;
import java.util.Stack;
 
/**
 * https://www.acmicpc.net/problem/9093
 * @author troh
 *
 */
public class _9093_단어뒤집기 {
    public static void main(String[] args) throws IOException {
        Scanner sc = new Scanner(System.in);
        
        int t = sc.nextInt();
        sc.nextLine();
        
        String[] inputs = new String[t];
        for(int i=0; i<t; i++) {
            inputs[i] = sc.nextLine();
        }
        
        for(int i=0; i<inputs.length; i++) {
            String s = getSolution(inputs[i]);
            System.out.println(s);
        }
    }
    
    private static String getSolution(String s) {
        s += '\n';
        Stack<Character> stack = new Stack<>(); 
        StringBuffer bf = new StringBuffer();
        for(int i=0; i<s.length(); i++) {
            if(s.charAt(i) == ' ' || s.charAt(i) == '\n') {
                while(!stack.isEmpty()) {
                    bf.append(stack.pop());
                }
                if(i != s.length()-1) {
                    bf.append(s.charAt(i));
                }
            } else {
                stack.push(s.charAt(i));
            }
        }
        return bf.toString();
    }
}
 
cs

배운점

문제에서 공백 또한 포함한 출력결과를 만들어야하기 때문에 입력받은 문자열에 '\n'을 임의로 추가해주고 문자열의 끝을 체크했습니다. 하지만 '\n'은 개행문자 이기때문에 출력결과에는 포함되지 않도록 만들었습니다.  씨언어에서는 문자열의 끝에 널문자가 포함되는 것으로 기억하는데 씨언어로 구현할 수 있다면 좀 더 편할 것 같네요..ㅎㅎ 


아무튼 스택의 성질은 무언가를 뒤집을 때 사용하면 좋을 것 같습니다. 






+ Recent posts