https://www.acmicpc.net/problem/17413
17413번: 단어 뒤집기 2
문자열 S가 주어졌을 때, 이 문자열에서 단어만 뒤집으려고 한다. 먼저, 문자열 S는 아래와과 같은 규칙을 지킨다. 알파벳 소문자('a'-'z'), 숫자('0'-'9'), 공백(' '), 특수 문자('<', '>')로만 이루어져
www.acmicpc.net
풀이
태그 밖에 있는 단어는 공백을 기준으로 구분하며 뒤집어야 한다.
태그 안에 있는 단어는 뒤집으면 안되고, 공백이 있어도 무시해야 한다.
로직
1. 단어를 뒤집기 위해 사용할 StringBuilder 타입 변수 sb를 선언하고 초기화한다.
2. 태그 안인지 밖인 지 구분할 boolean 타입 변수 flag를 선언하고 true로 초기화한다.
3. for문을 사용하여 입력받은 문자열의 각 글자마다 다음 과정을 수행한다.
- 공백인 경우, flag가 true라면 태그 밖의 단어이므로 sb에 저장된 단어를 뒤집어서 bw.write한 다음 sb를 초기화한다.
- '<' 인 경우, sb에 저장된 단어를 뒤집어서 bw.write한 다음 sb를 초기화하고, flag = false로 변경한다.
- '>' 인 경우, flag = true로 변경한다.
- flag가 true라면 태그 밖의 단어이므로 sb에 글자를 추가한다.
- flag가 false라면 태그 안의 단어이므로 바로 bw.write 한다.
4. for문을 완료한 다음 sb에 남은 글자가 있을 수 있으므로 sb에 저장된 단어를 뒤집어서 bw.write한다.
코드
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String str = br.readLine();
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringBuilder sb = new StringBuilder();
boolean flag = true; // 태그 밖이면 true, 태그 안이면 false
for (int i = 0; i < str.length(); i++) {
if (str.charAt(i) == ' ') {
if (flag) {
bw.write(sb.reverse().toString());
sb = new StringBuilder();
}
bw.write(' ');
continue;
}
else if (str.charAt(i) == '<') {
bw.write(sb.reverse().toString());
sb = new StringBuilder();
bw.write('<');
flag = false;
continue;
}
else if (str.charAt(i) == '>') {
bw.write('>');
flag = true;
continue;
}
if (flag)
sb.append(str.charAt(i));
else
bw.write(str.charAt(i));
}
bw.write(sb.reverse().toString());
bw.flush();
bw.close();
br.close();
}
}
수정한 코드
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String str = br.readLine();
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringBuilder sb = new StringBuilder();
boolean flag = true; // 태그 밖이면 true, 태그 안이면 false
for (int i = 0; i < str.length(); i++) {
if (str.charAt(i) == '<') {
bw.write(sb.reverse().toString());
sb = new StringBuilder();
bw.write('<');
flag = false; // 태그 안
continue;
}
else if (str.charAt(i) == '>') {
bw.write('>');
flag = true; // 태그 밖
continue;
}
// 태그 밖에 있으면
else if (flag) {
if (str.charAt(i) == ' ') {
bw.write(sb.reverse().toString());
sb = new StringBuilder();
bw.write(' ');
}
else sb.append(str.charAt(i));
}
// 태그 안에 있으면
else
bw.write(str.charAt(i));
}
bw.write(sb.reverse().toString()); // 나머지 모두 출력
bw.flush();
bw.close();
br.close();
}
}
글자가 '<' 인 경우, '>'인 경우, 태그 밖인 경우(공백인 경우와 아닌 경우), 태그 안인 경우로 if - else 문을 나눴다.
728x90
'Algorithm 문제 풀이 > 백준' 카테고리의 다른 글
[백준] 1713번 : 후보 추천하기 - 자바[Java] (0) | 2022.09.21 |
---|---|
[백준] 22858번 : 원상 복구 (small) - 자바[Java] (1) | 2022.09.21 |
[백준] 9019번 : DSLR - 자바[Java] (0) | 2022.09.16 |
[백준] 5014번 : 스타트링크 - 자바[Java] (1) | 2022.09.16 |
[백준] 1212번 : 8진수 2진수 - 자바[Java] (0) | 2022.09.12 |