새소식

알고리즘 문제풀이/BOJ

[백준 온라인 저지(BOJ)] 17413번 단어 뒤집기2 문제 자바(java)풀이

  • -

BOJ 17413번 단어 뒤집기2 문제 자바(java) 풀이

문제정리

  1. 문자열은 단어와 태그로 이루어져 있다.
  2. 태그는 '<'와 '>'사이에 있다.
  3. 단어는 영어 알파벳 소문자와 숫자로 이루어져 있다.
  4. 태그와 단어는 붙어있다.
  5. 이때 단어만 거꾸로 뒤집어서 출력한다. (태그는 뒤집으면 안됨)
  6. 태그사이에는 알파벳 소문자와 공백만 있다

문제풀이

  1. 문자 하나하나 탐색
    처음에는 문자를 하나씩 탐색하면서 했었다.
    하지만 이 방법은 시간초과가 나왔다.... ㅠㅠ
    답은 제대로 출력이 되었지만 모든 문자를 탐색하기에 시간이 오래걸렸다.

    flag를 설정하여 '<'이 나왔음을 인식하고 '<' 사이에 있는 문자는 결과 문자열에 그대로 쓴다.
    flag가 false로 되어있는 즉, '<'와 '>' 사이에 있지 않는 경우는 stack에 담아두었다가 꺼내서 거꾸로 하는 방식이었다.
  2. '<' 기준으로 나누기
    ```

  3. '<' 기준으로 나누어서 첫 문자가 '<' 인 경우 '<'를 쓰고 시작한다. 그리고 시작 인덱스를 1로한다.('<'로 시작하는 경우 split 했을 때 0번째 인덱스에 공백문자가 나옴)

  4. 그리고 나뉘어진 문자들의 '>'의 위치를 찾아서 '>'까지 문자를 그대로 붙인다.(태그 안의 문자들)

  5. '>' 뒤에 문자가 남아있는 경우 이는 태그 사이의 문자 이므로 공백 기준 split하여 각각 뒤집어서 붙인다.

  6. 그리고 마지막이 아닌 경우 '<'를 붙여준다.
    위의 과정을 반복하여 결과 문자인 result 문자열을 만들고 출력한다.

로직 설명 (2번 방법)

예를 들어 다음과 같은 글자를 2번 방법으로 거꾸로 뒤집어 출력해보자

<ab cd>fe hg<ij kl> 다음과 같은 글자가 있다

1. < 기준으로 나눈다. 그러면 다음과 같이 나뉜다
- ab cd>fe hg
- ij kl>

첫 문자가 '<'이므로 '<'를 출력한다.

2. '>'의 위치를 찾아 '>'까지 출력한다.
출력된 문자 : <ab cd>

3. '>'뒤의 문자는 공백 기준으로 나눈다
fe와 hg로 나뉘는데 이것을 각각 뒤집어서 출력한다.
출력된 문자: <ab cd>ef gh

4. 마지막이 아니므로 '<'를 출력한다.
출력된 문자: <ab cd>ef gh<

5. 반복한다. (2번 실행)
<ab cd>ef gh<ij kl>

14713번 단어 뒤집기2 자바 코드

백준 단어 뒤집기2 깃허브 자바 코드

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.ArrayList;

public class Main {
    public static void main(String[] args) throws NumberFormatException, IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

        String str = br.readLine();
        String result = "";

        // 1. '<' 기준 나누기
        String[] temp = str.split("<");

        // 1. 첫 문자가 '<'인지 판별
        int i;
        if(str.charAt(0) == '<') {
            i = 1;
            result += "<";
        }
        else
            i = 0;

        // '<'로 나눈 문자열에 대해 반복
        for(;i<temp.length; i++) {
            // 2. 나뉜 문자열에서 '>'의 위치 찾아서 '>'위치 까지의 문자열 출력한 문자열에 추가
            int idx = temp[i].indexOf(">");
            result += temp[i].substring(0, idx+1);

            // '>'뒤의 문자 즉, 태그 사이의 문자를 공백 기준으로 나눈다.
            String[] temp2 = temp[i].substring(idx+1, temp[i].length()).split(" ");
            for(int j=0; j<temp2.length; j++) {
                // 단어를 뒤집기 위해서 StringBuilder의 reverse 메소드 사용
                result += (new StringBuilder(temp2[j])).reverse().toString();
                if(j != temp2.length-1)
                    result += " ";
            }

            // 마지막 나뉜 문자를 제외 하고는 '<'를 붙인다.
            if(i != temp.length - 1)
                result += "<";
        }
        bw.write("" + result);
        bw.flush();
        br.close();
        bw.close();
    }
}
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.