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번 등장한다. 이걸 세려면 index
를 1씩만 증가시켜야 한다.
👇 겹치는 걸 세고 싶을 때
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" |
---|---|---|
겹치는 것도 포함하고 싶을 때 |
| 4번 등장 |
겹치는 건 빼고 싶을 때 |
| 2번 등장 |