Skip to main content

42. [Java] 문자열이 몇 번 등장하는지 세기

https://school.programmers.co.kr/learn/courses/30/lessons/181871

  • 문자열 myString과 pat이 주어진다.
  • myString에서 pat이 등장하는 횟수를 return

  • 1 ≤ myString ≤ 1000
  • 1 ≤ pat ≤ 10

정답코드

indexOf() + while 루프 써서 문자열 안에서 pat이 몇 번 나오는지 반복 탐색

class Solution {
    public int solution(String myString, String pat) {
        int cnt = 0;
        int idx = 0;
        while ((idx = myString.indexOf(pat, idx)) != -1) {
            cnt++;
            idx += 1; // 다음 위치부터 탐색
            // 겹치는 것도 찾으려면 index++ 이 아니라
            // index += pat.length() 대신 index++
        }
        
        return cnt;
    }
}
  • 겹치는 경우까지 세고 싶다면 index++
  • 겹치지 않는 경우만 세고 싶다면 index += pat.length()
String.indexOf(pat, fromIndex)
int index = myString.indexOf(pat, fromIndex);
  • 문자열에서 pat어디서부터 나오는지 위치를 찾는다
  • fromIndex 이후부터 찾기 시작하니까 index를 어떻게 증가시키느냐에 따라 겹치거나 안 겹치는 걸 제어할 수 있다.

겹치게 세는 경우 vs 안 겹치게 세는 경우

아래와 같은 예시 코드가 있다.

String myString = "aaaaa";
String pat = "aa";

이때, "aa"는 아래와 같이 겹쳐서 나올 수 있다.

[0~1] → "aa"
[1~2] → "aa"
[2~3] → "aa"
[3~4] → "aa"

즉, aaaaa안에는 aa가 총 4번 등장한다. 이걸 세려면 index1씩만 증가시켜야 한다.


👇 겹치는 걸 세고 싶을 때
while ((index = myString.indexOf(pat, index)) != -1) {
    count++;
    index++; // 1칸만 이동 → 겹치는 것도 다음 탐색에 포함됨
}

"aaaaa" 안에서 "aa"가 겹쳐서 4번 카운트됨


👇 겹치지 않게 세고 싶을 때
index += pat.length(); // pat만큼 건너뜀

"aa" → 그 다음 "aa"는 안 겹치게 찾음
→ 이 경우 "aaaaa"에서는 "aa"2번만 나온다.

목적

index 증가 방식

예: "aaaaa"에서 "aa"

겹치는 것도 포함하고 싶을 때

index++

4번 등장

겹치는 건 빼고 싶을 때

index += pat.length()

2번 등장