[Java] String.indexOf() (ft.BOJ17413 java)

민지·2024년 2월 1일
0

Java

목록 보기
5/9

들어가며

알고리즘 코드를 리팩토링하다가 메서드를 발견했다.
String 의 index는 거의 써본 일이 없다.
파라미터 중에 fromIndex 가 뭔지 궁금해서 포스팅한다.

String.indexOf(String str, int fromIndex)

String.indexOf()
문자열에서 특정 문자나 문자열이 처음으로 등장하는 인덱스를 반환하는 함수.

여기서 두번째 파라미터를 안쓰면 맨 처음 발견하는 index를 리턴한다.

탐색을 시작할 위치를 정해주는 게 fromIndex!
유용하다 ..

그렇다고 한다.

BOJ17413 단어 뒤집기2 java

문제링크
얘는 사실 스택을 활용한 문자열 문제이고,
중간에 <word> 이런 태그가 나오면 해당 꺾쇠에 감싸진 애들은 그대로 출력하는 과정에서 indexOf() 가 쓰였다.

기존 코드

태그가 등장할 때, '>'가 나오기 전까지 반복문을 통해 하나씩 빌더에 넣어줬었다.

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() 는 꽤 유용할 것 같으니 기억해두자.

profile
개발의, 개발에 의한, 개발을 위한 기록장

0개의 댓글

관련 채용 정보