[백준/JAVA] 17413번: 단어 뒤집기 2
📖 문제
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