티스토리 뷰

두 가지 방법으로 풀 수 있는 문제

 

 

17413번: 단어 뒤집기 2

문자열 S가 주어졌을 때, 이 문자열에서 단어만 뒤집으려고 한다. 먼저, 문자열 S는 아래와과 같은 규칙을 지킨다. 알파벳 소문자('a'-'z'), 숫자('0'-'9'), 공백(' '), 특수 문자('<', '>')로만 이루어져

www.acmicpc.net

 

풀이

기본적으로 readLine() 으로 String을 입력받은 후 charAt(index) method를 이용하여 한 문자씩 비교한다.

 

1. StringBuilder의 substring(startIndex, endIndex), reverse() method를 이용한 풀이

mark라는 변수를 두어 >가 어느 위치에 있는지 기억한다.

문자열 길이만큼 반복문을 수행한다.

 

substring method를 사용하다 보면 헷갈리는데 endIndex는 (자르려는 문자열의 마지막 문자의 인덱스) + 1이다.

즉, 범위가 [시작 인덱스, 끝 인덱스) 이다.

 

  1. <를 만났을 경우
    • substring(mark + 1, (현재 인덱스)) 가 기존의 문자열이 되므로 reverse()하여 정답에 append한다.
    • >를 만날 때 까지 인덱스를 증가시키며 문자를 정답에 append한다.
    • mark 값을 >의 인덱스로 갱신한다.
  2. ' '을 만났을 경우
    • substring(mark + 1, (현재 인덱스)) 가 기존의 문자열이 되므로 reverse()하여 정답에 append한다.
    • mark 값을 ' '의 인덱스로 갱신한다.

<>가 안 나올수도 있으므로 마지막에 substring(mark + 1)reverse()한 문자열을 정답에 append한다.

 

2. Stack을 이용한 풀이

문자열 길이만큼 반복문을 수행한다.

 

  1. <를 만났을 경우
    • Stack이 빌때까지 정답에 append한다.
    • >를 만날 때 까지 인덱스를 증가시키며 문자를 정답에 append한다.
    • 인덱스++의 조건으로 반복문을 수행했기 때문에 현재 인덱스의 문자를 정답에 append한다.
  2. ' '을 만났을 경우
    • Stack이 빌때까지 정답에 append한다.
  3. 1, 2가 아닌 경우
    • Stack에 현재 인덱스의 문제를 push한다.

마지막에 Stack이 빌때까지 정답에 append한다.

 

 

 

코드1 (reverse() method)

import java.util.*;
import java.io.*;

public class Main {

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        String str = br.readLine();
        StringBuilder sb = new StringBuilder();
        StringBuilder temp;
        int mark = -1;
        for (int i = 0; i < str.length(); i++) {
            condition:
            if (str.charAt(i) == '<') {
                temp = new StringBuilder(str.substring(mark + 1, i));
                sb.append(temp.reverse());

                while (str.charAt(i) != '>')
                    sb.append(str.charAt(i++));

                mark = i;
                sb.append(str.charAt(i));
            }
            if (str.charAt(i) == ' ') {
                if (mark + 1 == i) {
                    sb.append(str.charAt(i));
                    mark = i;
                }
                else {
                    temp = new StringBuilder(str.substring(mark + 1, i));
                    sb.append(temp.reverse());
                    sb.append(str.charAt(i));
                    mark = i;
                }
            }
        }
        temp = new StringBuilder(str.substring(mark + 1));
        sb.append(temp.reverse());


        bw.write(sb.toString());
        br.close();
        bw.close();
    }

}

실행 결과

 

 

코드2 (Stack)

import java.util.*;
import java.io.*;

public class Main {

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

        for (int i = 0; i < str.length(); i++) {
            if (str.charAt(i) == '<') {
                while(!s.isEmpty()) sb.append(s.pop());
                while(str.charAt(i) != '>') sb.append(str.charAt(i++));
                sb.append(str.charAt(i));
            }
            else if (str.charAt(i) == ' ') {
                while(!s.isEmpty()) sb.append(s.pop());
                sb.append(str.charAt(i));    
            } else s.push(str.charAt(i));
        }
        while(!s.isEmpty()) sb.append(s.pop());

        bw.write(sb.toString());
        br.close();
        bw.close();
    }

}

실행결과

'알고리즘' 카테고리의 다른 글

[백준] 3055. 탈출 (Java)  (0) 2021.01.24
[백준] 16234. 인구이동 (Java)  (0) 2021.01.13
[백준] 14500. 테트로미노 (Java)  (0) 2020.12.27
[백준] 2290. LCDTest (Java)  (1) 2020.12.23
[백준] 2933. 미네랄  (0) 2020.12.20
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
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
글 보관함