코테/백준

[백준/JAVA] 17413번: 단어 뒤집기 2

imname1am 2024. 1. 12. 00:25
반응형

📖 문제

 

17413번: 단어 뒤집기 2

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

www.acmicpc.net

 

 

 

💡  풀이 방식

• 스택

 

 

case1. 여는 꺽새 <를 입력 받은 경우
: 여태 스택에 저장해둔 문자열을 거꾸로 출력하고, 여는 꺽새가 있으니 boolean형 변수를 true로 바꾼다.

그리고 현재 위치의 문자 <도 출력한다.


case2. 닫는 꺽새 >를 입력 받은 경우
: 여는 꺽새가 없으니 boolean형 변수를 false로 바꾸고, 현재 위치의 문자 >도 출력한다.


case3. 여는 꺽새가 있는 경우
: 괄호 안의 글자는 뒤집지 않고 그대로 출력되어야 하므로, 현재 위치의 문자를 그대로 출력한다.


case4. 여는 꺽새가 없는 경우
1. 현재 위치의 문자가 띄어쓰기인 경우
: 스택에 쌓인 문자를 뒤집어 출력하고, 띄어쓰기도 출력한다.


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
import java.util.*;
import java.io.*;
 
public class Main {
    // 문자열 거꾸로 출력하는 메소드 → 스택 활용 !
    private static void print(Stack st) {
        while(!st.isEmpty()) {
            System.out.print(st.pop());
        }
    }
 
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
 
        String str = br.readLine();
        boolean check = false; // 꺽새 있는지 판별용 변수 🔔
 
        Stack<Character> stack = new Stack<>();
 
        for(int i = 0 ; i < str.length() ; i++) {
            if(str.charAt(i) == '<') {  // < 만나면 여태 저장해둔 문자열 거꾸로 출력
                print(stack);
                check = true;
                System.out.print(str.charAt(i));
            }
            else if(str.charAt(i) == '>') {
                check = false;
                System.out.print(str.charAt(i));
            }
            else if(check) {
                System.out.print(str.charAt(i));
            }
            else {
                if(str.charAt(i) == ' ') {
                    print(stack);
                    System.out.print(str.charAt(i));
                }
                else {
                    stack.push(str.charAt(i));
                }
            }
        }
 
        print(stack);
    }
}
cs

 


💦 어려웠던 점

꺽새가 있는지 판별용 boolean형 변수를 사용할 생각을 하지 못 했다.

출력을 이렇게 자주 해줄 생각을 하지 못 했다.

조건문을 얼마나 만들어줘야 하는지 생각하지 못 했다.

 

 

1회독 2회독 3회독 4회독 5회독
V 240624      

 

 

 

(+240624 2회독 : 22332KB, 264ms)

꺽새 안에 있는 문자열은 그대로 출력하기 위해 를 사용하고,

꺽새 밖에 있는 문자열은 거꾸로 출력하기 위해 스택을 사용했다.

 

혼자 풀기도 했고

메모리도 메모리지만 시간 면에서 훠어얼씬 효율적이라 뿌듯하다~~

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
import java.util.*;
import java.io.*;
 
public class Main {
    static char[] ch;
    static Stack<Character> st = new Stack<>();
    static Queue<Character> q = new ArrayDeque<>();
    static StringBuilder sb = new StringBuilder();
    
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        
        ch = br.readLine().toCharArray();
        
        boolean exists = false;    // 꺽새 안에 있는지 판별용 변수
        
        for(int i = 0 ; i < ch.length ; i++) {
            if(ch[i] == ' ') {
                if(!exists) {   // 괄호 "밖" 띄어쓰기인 경우, 여태 저장한 문자열 "거꾸로" 출력하기
                    printStack();
                }
                else {          // 괄호 "속" 띄어쓰기인 경우, 여태 저장한 문자열 "그대로" 출력하기
                    printQueue();
                }
                
                sb.append(" ");
            }
            else if(ch[i] == '<') { // 여는 괄호인 경우, 여태 앞에서 저장한 문자열 "거꾸로" 출력하기
                printStack();
                
                exists = true;
                q.add('<');
            }
            else if(ch[i] == '>') { // 닫는 괄호인 경우, 여태 앞에서 저장한 문자열 "그대로" 출력하기
                printQueue();
                
                exists = false;
                sb.append('>');
            }
            else {  // 문자/숫자인 경우
                if(!exists) {    // 괄호 밖 문자/숫자인 경우, "거꾸로" 출력하고자 "스택"에 넣기
                    st.push(ch[i]);
                }
                else {          // 괄호 속 문자/숫자인 경우, "그대로" 출력하고자 "큐"에 넣기
                    q.add(ch[i]);
                }
            }
        }
        
        printStack();   // 마지막으로 스택에 저장된 원소들 털어넣기
        System.out.println(sb.toString());
    }
    
    // 괄호 밖에 있는 원소들 "거꾸로" 출력하기 위한 함수
    private static void printStack() {
        while(!st.isEmpty()) {
            sb.append(st.pop());
        }
    }
    
    // 괄호 안에 있는 원소들 "그대로" 출력하기 위한 함수
    private static void printQueue() {
        while(!q.isEmpty()) {
            sb.append(q.poll());
        }
    }
}
cs

 


(참고)

 

백준 17413번 단어뒤집기 2 java

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

1-7171771.tistory.com

 

[JAVA/17413번] 단어 뒤집기 2

해결방법이전 단어뒤집기 문제의 경우, 공백을 기준으로 단어를 나누어 반복문의 조건식을 이용하여 출력하였다.하지만 이번 단어뒤집기2의 경우, 꺽새의 내부 문자열은 그대로 유지하고 꺽새

velog.io

 

반응형