안녕하세요. 회사와 함께 성장하고 싶은 KOSE입니다.
이번 포스팅은 백준 문자열 문제 - 단어 뒤집기 2 자바 풀이를 진행하도록 하겠습니다.
문제 출처: https://www.acmicpc.net/submit/17413
1. 풀이 소스
import java.io.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String str = br.readLine();
StringBuilder sb = new StringBuilder();
boolean flag = false; // '<' 의 시작여부
int start = -1; // 단어를 뒤집어야할 때 역순으로 순회하기 위한 인덱스 (초기화 -1)
int end = -1;
for (int i = 0; i < str.length(); i++) {
char c = str.charAt(i);
if (c == '<') {
if (start != -1) { // 만약 '<' 이전에 'apple<' 처럼 뒤집어야 하는 문자열이 있음
for (int j = end; j >= start; j--) sb.append(str.charAt(j));
start = -1; // 초기화
end = -1;
}
flag = true; // flag가 true라면 '>'로 닫히지전까지 유효
}
if (flag) sb.append(str.charAt(i)); // 현재 꺽쇠 안이므로 flag
else {
if (start == -1) start = i; // 시작 인덱스 설정
end = i; // 끝 인덱스는 계속 업데이트 (단어 길이가 1일 수 있음)
if (c == ' ') {
for (int j = end - 1; j >= start; j--) sb.append(str.charAt(j));
start = -1;
sb.append(c);
}
}
if (c == '>') flag = false; // flag false로 설정하여 꺽쇠 해제
}
// 꺽쇠 혹은 공백이 없어서 sb에 추가되지 않은 문자열이 있을 수 있으므로
if (start != -1) {
for (int j = end; j >= start; j--) sb.append(str.charAt(j));
}
System.out.print(sb);
}
}
2. 풀이 중점 사항
꺽쇠 내부가 아닌 밖에서 단어를 뒤집어야 할 때, start, end 인덱스를 활용하여 역순으로 sb에 append 하는 것이 중요하였습니다.
단어가 뒤집힐 수 있는 경우를 고려하여, 꺽쇠 밖에 위치하여 공백이 나오거나 다음 char에 '<'를 만난다면, 단어가 있다면 뒤집을 수 있도록 하였습니다. 테스트 케이스 1과 같이 'judge'는 꺽쇠를 만나서 sb에 append 되거나, 공백으로 append 되지 않습니다. 따라서 str.length()에 대한 순회를 마친 후 start 인덱스로 단어가 있는지 판단하였습니다.
이상으로 단어 뒤집기 2 자바 풀이를 마치도록 하겠습니다. 감사합니다!
'Algorithm' 카테고리의 다른 글
[Algorithm] 백준 문자열 문제 - 문자열 게임 2(20437) 자바 풀이 (2) | 2023.05.17 |
---|---|
[Algorithm] 백준 문자열 문제 - 회문(17609) 자바 풀이 (0) | 2023.05.16 |
[Algorithm] 백준 문자열 문제 - 파일 정리(20291) 자바 풀이 (0) | 2023.05.16 |
[Algorithm] 백준 문자열 문제 - 염색체(9342) 자바 풀이 (0) | 2023.05.16 |
[Algorithm] 백준 문자열 문제 - 비밀번호 발음하기(4659) 자바 풀이 (0) | 2023.05.16 |