Post

[Baekjoon/Programmers] 17413 단어 뒤집기2

17413 단어 뒤집기2문제 해결 과정.

단어 뒤집기2는 주어진 문장에서 태그(<>로 감싸져 있는 부분)를 제외한 단어를 모두 뒤집어서 출력하는 문제였다. 예를 들어 hello world 라는 문장이 주어진다면 olleh dlrow를 출력해야 한다.

string의 substring을 이용하고 싶어서, tag와 word의 시작과 끝의 인덱스를 의미하는 변수와 현재 탐색하고 있는 char값이 tag/word에 속하는지 여부를 나타내는 boolean 변수를 생성했고 다음과 같은 식으로 코드를 작성했다. 난이도가 어렵지는 않았지만 생각보다 조건을 까다롭게 걸어줘야 해서 몇번의 수행착오가 있었다.

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
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
import java.io.*;

public class Main {

    public static String flip(String str) {
        StringBuilder flippedStr = new StringBuilder("");
        for (int i=str.length()-1; i>=0; i--) {
            flippedStr.append(str.charAt(i));
        }
        return flippedStr.toString();
    }

    public static void main(String[] args)  throws IOException {

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder answer = new StringBuilder("");

        String s = br.readLine();

        boolean isTag = false;
        int tagSt = -1;
        int tagFn = -1;

        boolean isWord = false;
        int wordSt = -1;
        int wordFn = -1;


        for (int i=0; i<s.length();i++) {
            char c = s.charAt(i);

            switch (c) {
                case 60: //'<'
                    if (isWord) {
                        wordFn = i;
                        String flippedStr = flip(s.substring(wordSt,wordFn));
                        answer.append(flippedStr);
                        isWord = false;
                    }
                    tagSt = i;
                    isTag = true;
                    break;
                case 62: //'>'
                    tagFn = i;
                    answer.append(s.substring(tagSt, tagFn+1));
                    isTag = false;
                    break;
                case 32: //' '
                    if (isWord) {
                        wordFn = i;
                        String flippedStr = flip(s.substring(wordSt,wordFn));
                        answer.append(flippedStr).append(c);
                        isWord = false;
                    } else if (!isTag) answer.append(c);
                    break;
                default:
                    if (!isTag&&!isWord) {
                        isWord = true;
                        wordSt = i;

                    } else if (i==s.length()-1&&isWord) {
                        String flippedStr = flip(s.substring(wordSt));
                        answer.append(flippedStr);
                    }
                    break;
            }
        }
        System.out.println(answer);
    }
}

그리고 내가 원래 하고 싶었던, ‘<’가 들어오면 ‘>’가 올 때까지 순회하는 부분의 로직은 아래의 2등 선생님께서 이렇게 구현해 주셨다. image image

코드를 작성하는 중 String의 contains랑 stack 자료구조를 이용해 보면 어떨까 라는 생각이 들었는데, 함 해보자!

(수정중)

This post is licensed under CC BY 4.0 by the author.