algorithm

백준 17413(JAVA)

yjs3819 2021. 7. 12. 13:12
728x90

문제

주어진 문자열 S중 단어만 찾아서, 단어만 뒤집어라

  • 문제 자체는 이해하기가 쉽다.
  • 단어는 태그가 아니며, 단어끼리는 ' ' 공백으로 띄워져있다.

풀이

  • 단어가 시작하는 index를 저장할 start변수를 통해 현재 index까지의 StringBuilder를 만들고 reverse()메서드로 뒤집은뒤 replace메서드로 다시 부분 문자열을 변경하면 된다!
  • java로 풀면 불변 클래스인 String으로는 데이터 수정이 되지않으므로 StringBuilder로 하는것이 적절하다.(String은 새로운 객체를 생성함, 하나의 인스턴스에서 수정이 되지않음)

코드

package baekjoon.구현;

import java.io.*;

public class Main17413 {
    static String str;

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

        StringBuilder sb = new StringBuilder(str);

        int start = 0;
        int end = 0;
        boolean isWord = true;

        for(int i = 0; i < str.length(); i++){
            if(str.charAt(i) == '<'){
                if(end != 0){
                    StringBuilder s = new StringBuilder();
                    for(int j = start; j <= end; j++){
                        s.append(str.charAt(j));
                    }
                    String reverseStr = s.reverse().toString();
                    sb.replace(start, end + 1, reverseStr);
                }
                isWord = false;
            }else if(str.charAt(i) == '>'){
                start = i + 1;
                isWord = true;
            }else if(isWord && str.charAt(i) == ' '){
                StringBuilder s = new StringBuilder();
                for(int j = start; j <= end; j++){
                    s.append(str.charAt(j));
                }
                String reverseStr = s.reverse().toString();
                sb.replace(start, end + 1, reverseStr);

                start = i + 1;
            }else if(i == str.length() - 1){
                // 마지막문자
                StringBuilder s = new StringBuilder();
                for(int j = start; j <= end + 1; j++){
                    s.append(str.charAt(j));
                }
                String reverseStr = s.reverse().toString();
                sb.replace(start, str.length() + 1, reverseStr);

            }
            end = i;
        }
        bw.write(sb.toString()+"\n");

        bw.flush();
        bw.close();

    }
}

/**
 단어인 곳을 식별해서 단어가 시작하는 곳의 위치를 start변수에 담고,
 start부터 end(현재 i)까지를 뒤집어서 변경해서 넣었음.
 단어인곳을 식별하는건 isWord라는 boolean변수로 단어인지 아닌지 식별하였꼬, >가 끝난다음을 start로, ' '가 끝난 다음위치를 단어의 start로 하여서 품
 **/
728x90

'algorithm' 카테고리의 다른 글

백준 1105(JAVA)  (0) 2021.07.19
백준 14469(JAVA)  (0) 2021.07.17
백준 11000(JAVA)  (0) 2021.07.16
백준 9009(JAVA)  (0) 2021.07.14
백준 9081(JAVA)  (0) 2021.07.14