문제링크
구현 문자열
실버 3
문자열에서 단어만 뒤집기
조건 문자말고도 < >가 있을 수 있다.
태그는 단어가 아니다. 태그와 단어사이는 공백이 없다.
문자열 S
S의 단어를 뒤집어 출력
indexOf를 주로 사용했다.
string.indexOf("찾는 값",탐색시작할인덱스값(초기값0) 숫자형으로 리턴
string.substring(a,b) 인덱스 a와 b-1까지 잘라서 string형으로 리턴
start 단어체크를 시작하는 string의 인덱스값
blank, opentag : 단어의 마지막 글자의 인덱스 값
import java.io.*;
import java.util.*;
public class 백준17413 {
static Scanner scan=new Scanner(System.in);
static String arr;
static int blank,opentag;
static StringBuilder sb=new StringBuilder();
public static void main(String[] args) {
// TODO Auto-generated method stub
arr=scan.nextLine();
solve();
System.out.println(sb);
}
public static void solve() {
int i=0;
int start=0;
int length=arr.length();
while(start<length) {
//탐색 시작하는 위치의 첫글자가 태그이면 꺽쇠 닫힐때까지 기록
if(arr.charAt(start)=='<') {
int tagend=arr.indexOf('>',start);
String str=arr.substring(start,tagend+1);
sb.append(str);
start=tagend+1;
continue;
}
//태그가 아니고 글자이면
blank=arr.indexOf(" ",start); //int blank
opentag=arr.indexOf("<",start);
if(blank==-1||opentag==-1) {
if(blank<opentag) {
reverse(start,opentag-1,false);
start=opentag;
}
else if(blank==opentag) { //마지막 단어
reverse(start,length-1,false);
break;
}
else {
reverse(start,blank-1,true);
start=blank+1;
}
}
else {
if(blank<opentag) {
reverse(start,blank-1,true);
start=blank+1;
}
else if(blank>opentag) {
reverse(start,opentag-1,false);
start=opentag;
}
}
}
}
public static void reverse(int start,int end,boolean isblank) {
for(int i=end;i>=start;i--) {
sb.append(arr.charAt(i));
}
if(isblank) {
sb.append(' ');
}
}
}