https://www.acmicpc.net/problem/17413
문제
문자열 S가 주어졌을 때, 이 문자열에서 단어만 뒤집으려고 한다.
먼저, 문자열 S는 아래와과 같은 규칙을 지킨다.
- 알파벳 소문자('a'-'z'), 숫자('0'-'9'), 공백(' '), 특수 문자('<', '>')로만 이루어져 있다.
- 문자열의 시작과 끝은 공백이 아니다.
- '<'와 '>'가 문자열에 있는 경우 번갈아가면서 등장하며, '<'이 먼저 등장한다. 또, 두 문자의 개수는 같다.
태그는 '<'로 시작해서 '>'로 끝나는 길이가 3 이상인 부분 문자열이고, '<'와 '>' 사이에는 알파벳 소문자와 공백만 있다. 단어는 알파벳 소문자와 숫자로 이루어진 부분 문자열이고, 연속하는 두 단어는 공백 하나로 구분한다. 태그는 단어가 아니며, 태그와 단어 사이에는 공백이 없다.
해설
괄호 안에 있는지를 확인할 변수 check, 괄호 안일 때의 문자를 저장할 sb StringBuilder,
밖일 때를 저장할 saveChar StringBuilder를 선언하였다.
※ StringBuilder가 아닌 빈 문자열로 선언했을 시 시간초과가 떴다.
문자열을 읽으며 '<'를 만났다면
saveChar에 저장된 문자를 뒤집어 sb에 넣고 saveChar를 초기화시켜준다.
또한 여기부턴 괄호의 안이므로 check를 true로 한다.
마지막으로 sb에 '<'를 넣는다.
이제 '>'를 만났을 때를 보자.
괄호의 마지막이므로 check를 false로 해주고, sb에 '>'를 넣는다.
' '(공백)을 만났을 때는
괄호의 안인지 아닌지를 확인해야 한다.
괄호의 안이라면 문자를 뒤집을 필요가 없으므로 sb에 바로 넣으면 된다.
하지만 괄호의 밖이라면 앞의 문자들을 뒤집어 sb에 넣고, sb에 공백을 마저 넣는다.
이제 일반 문자들일 때만이 남았다.
괄호의 안이라면 sb에, 밖이라면 saveChar에 문자를 넣는다.
문장의 끝까지 확인을 하고 반복문을 탈출했다면
saveChar에 남은 문자가 있을 시 뒤집어 sb에 넣어준다.
소스 코드
import java.lang.StringBuilder
fun main() = with(System.`in`.bufferedReader()) {
val str = readLine().toCharArray()
var check = false
var saveChar = StringBuilder()
var sb = StringBuilder()
for(i in str) {
if(i == '<') {
sb.append(saveChar.reversed())
saveChar.clear()
check = true
sb.append('<')
}
else if(i == '>') {
check = false
sb.append(">")
}
else if(i == ' ') {
if(!check) {
sb.append(saveChar.reversed()).append(' ')
saveChar.clear()
}
else sb.append(' ')
}
else {
if(check) sb.append(i)
else saveChar.append(i)
}
}
if(saveChar.isNotEmpty()) sb.append(saveChar.reversed())
println(sb.toString())
}
'PS(Problem Solving) > BOJ' 카테고리의 다른 글
[백준/BOJ] 1935번: 후위 표기식2 (0) | 2022.02.06 |
---|---|
[백준/BOJ] 10973번: 이전 순열 (0) | 2022.02.05 |
[백준/BOJ] 9372번: 상근이의 여행 (0) | 2022.02.05 |
[백준/BOJ] 1735번: 분수 합 (0) | 2022.02.04 |
[백준/BOJ] 2407: 조합 (0) | 2022.02.02 |
댓글