BOJ 17413번 단어 뒤집기2 문제 자바(java) 풀이
문제정리
- 문자열은 단어와 태그로 이루어져 있다.
- 태그는 '<'와 '>'사이에 있다.
- 단어는 영어 알파벳 소문자와 숫자로 이루어져 있다.
- 태그와 단어는 붙어있다.
- 이때 단어만 거꾸로 뒤집어서 출력한다. (태그는 뒤집으면 안됨)
- 태그사이에는 알파벳 소문자와 공백만 있다
문제풀이
문자 하나하나 탐색
처음에는 문자를 하나씩 탐색하면서 했었다.
하지만 이 방법은 시간초과가 나왔다.... ㅠㅠ
답은 제대로 출력이 되었지만 모든 문자를 탐색하기에 시간이 오래걸렸다.
flag를 설정하여 '<'이 나왔음을 인식하고 '<' 사이에 있는 문자는 결과 문자열에 그대로 쓴다.
flag가 false로 되어있는 즉, '<'와 '>' 사이에 있지 않는 경우는 stack에 담아두었다가 꺼내서 거꾸로 하는 방식이었다.
'<' 기준으로 나누기
```
'<' 기준으로 나누어서 첫 문자가 '<' 인 경우 '<'를 쓰고 시작한다. 그리고 시작 인덱스를 1로한다.('<'로 시작하는 경우 split 했을 때 0번째 인덱스에 공백문자가 나옴)
그리고 나뉘어진 문자들의 '>'의 위치를 찾아서 '>'까지 문자를 그대로 붙인다.(태그 안의 문자들)
'>' 뒤에 문자가 남아있는 경우 이는 태그 사이의 문자 이므로 공백 기준 split하여 각각 뒤집어서 붙인다.
그리고 마지막이 아닌 경우 '<'를 붙여준다.
위의 과정을 반복하여 결과 문자인 result 문자열을 만들고 출력한다.
로직 설명 (2번 방법)
예를 들어 다음과 같은 글자를 2번 방법으로 거꾸로 뒤집어 출력해보자
<ab cd>fe hg<ij kl> 다음과 같은 글자가 있다
1. < 기준으로 나눈다. 그러면 다음과 같이 나뉜다
- ab cd>fe hg
- ij kl>
첫 문자가 '<'이므로 '<'를 출력한다.
2. '>'의 위치를 찾아 '>'까지 출력한다.
출력된 문자 : <ab cd>
3. '>'뒤의 문자는 공백 기준으로 나눈다
fe와 hg로 나뉘는데 이것을 각각 뒤집어서 출력한다.
출력된 문자: <ab cd>ef gh
4. 마지막이 아니므로 '<'를 출력한다.
출력된 문자: <ab cd>ef gh<
5. 반복한다. (2번 실행)
<ab cd>ef gh<ij kl>
14713번 단어 뒤집기2 자바 코드
백준 단어 뒤집기2 깃허브 자바 코드
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.ArrayList;
public class Main {
public static void main(String[] args) throws NumberFormatException, IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
String str = br.readLine();
String result = "";
// 1. '<' 기준 나누기
String[] temp = str.split("<");
// 1. 첫 문자가 '<'인지 판별
int i;
if(str.charAt(0) == '<') {
i = 1;
result += "<";
}
else
i = 0;
// '<'로 나눈 문자열에 대해 반복
for(;i<temp.length; i++) {
// 2. 나뉜 문자열에서 '>'의 위치 찾아서 '>'위치 까지의 문자열 출력한 문자열에 추가
int idx = temp[i].indexOf(">");
result += temp[i].substring(0, idx+1);
// '>'뒤의 문자 즉, 태그 사이의 문자를 공백 기준으로 나눈다.
String[] temp2 = temp[i].substring(idx+1, temp[i].length()).split(" ");
for(int j=0; j<temp2.length; j++) {
// 단어를 뒤집기 위해서 StringBuilder의 reverse 메소드 사용
result += (new StringBuilder(temp2[j])).reverse().toString();
if(j != temp2.length-1)
result += " ";
}
// 마지막 나뉜 문자를 제외 하고는 '<'를 붙인다.
if(i != temp.length - 1)
result += "<";
}
bw.write("" + result);
bw.flush();
br.close();
bw.close();
}
}