알고리즘 코드를 리팩토링하다가 메서드를 발견했다.
String 의 index는 거의 써본 일이 없다.
파라미터 중에 fromIndex 가 뭔지 궁금해서 포스팅한다.
String.indexOf()
문자열에서 특정 문자나 문자열이 처음으로 등장하는 인덱스를 반환하는 함수.
여기서 두번째 파라미터를 안쓰면 맨 처음 발견하는 index를 리턴한다.
탐색을 시작할 위치를 정해주는 게 fromIndex
!
유용하다 ..
그렇다고 한다.
문제링크
얘는 사실 스택을 활용한 문자열 문제이고,
중간에 <word>
이런 태그가 나오면 해당 꺾쇠에 감싸진 애들은 그대로 출력하는 과정에서 indexOf()
가 쓰였다.
태그가 등장할 때, '>'
가 나오기 전까지 반복문을 통해 하나씩 빌더에 넣어줬었다.
'>'
가 나오는 인덱스를 찾은 후, 한번에 집어 넣는다.
반복문을 사용하지 않으니 직관적이고 코드가 깔끔해졌다.
package solution;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Stack;
public class BOJ17413_단어뒤집기2 {
private static final char SPACE = ' ';
private static final char OPEN_TAG = '<';
private static final char CLOSE_TAG = '>';
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String input = br.readLine();
/*
후입선출 > 스택쓰자
'<' 얘가 들어오기 전까지 스택에 넣는다. 들어오는 순간 스택에 있던것들을 빌더에 빼서 저장.
'>' 들어올때까지 그대로 빌더에 저장
*/
System.out.println(reverseWord(input));
}
private static String reverseWord(String S) {
Stack<Character> stack = new Stack<>();
StringBuilder sb = new StringBuilder();
int idx = 0;
while(idx < S.length()) {
char c = S.charAt(idx);
if(c == SPACE) {
popStack(stack, sb);
sb.append(SPACE);
} else if(c == OPEN_TAG) {
popStack(stack, sb);
idx = addTag(S, sb, idx);
} else {
stack.push(c);
}
idx++;
}
popStack(stack, sb);
return sb.toString();
}
private static void popStack(Stack<Character> s, StringBuilder sb) {
while(!s.isEmpty()) {
sb.append(s.pop());
}
}
private static int addTag(String s, StringBuilder sb, int startIdx) {
int endIndex = s.indexOf(CLOSE_TAG, startIdx);
sb.append(s, startIdx, endIndex+1);
return endIndex;
}
}
String 메서드 참 많다.. indexOf()
는 꽤 유용할 것 같으니 기억해두자.