
import java.util.Scanner;
public class BOJ1543 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String str = sc.nextLine();
String key = sc.nextLine();
int i, j, k, result = 0;
for(i=0;i<str.length();i++){
j = i;
for(k=0;k<key.length();k++){
if(j == str.length()) // key는 남아있는데 str이 끝난 경우, 이 조건이 없으면 에러남
break;
else if(str.charAt(j) == key.charAt(k)) // 같으면 다음글자 비교
j++;
else // 다르면 끝
break;
}
if(k == key.length()){ // str에 key가 있다면
result++;
i = j - 1; // 반복문에서 i++되므로 -1해주어야 함
}
}
System.out.println(result);
}
}
코드에서 큰 논리는 이렇다.
1. str의 첫 글자부터 끝까지 확인한다.
2. str의 지금 글자부터 key의 글자를 각각 비교한다.
3-1. str에 key가 있으면, str속의 key이후 위치부터 2를 반복한다.
3-2. key가 없으면 str의 다음 글자부터 2를 반복한다.
이게 무슨소리냐..
str: abbccc key: bb 인 경우
a b b c c c b b
[0][1][2][3][4][5] [0][1]
1. str을 끝까지 확인할거다. 2. 첫글자를 비교해보자. str의 [0]a 와 key의 [0]b는 다르다.
그래서 3-2가 적용된다. str의 다음글자인 [1]b로 넘어간다. 그리고 다시 2로 돌아간다.
2. str의 [1]b와 key의 [0]b를 비교한다. 같다 -> 다음 글자도 key와 같은지 비교 -> [2]b 와 [1]b가 같다 -> str안에 key가 있다!
3-1. key가 있으므로 str속의 key이후 위치, 즉 [3]c부터 다시 2(str과 key가 같은지)를 반복한다.
<변수 설명>
i: str을 끝까지 확인하는 용도, 직접움직이지 않음
j: str의 i로부터 움직여서 key와 비교하는 변수
k: key를 움직이는 변수
주어진 예제 외에 신경써야할 반례는
aabb ab 1
abababc ababc 1
aa aa 1
정도가 있다. 특히 나는 2번째의 abababc ababc 처럼 중간에 달라지는 경우를 예상하지 못해서 시간을 꽤 썼다. 3-1을 구현하지 않았었다.
다른 풀이법: indexOf 함수 이용
str.indexOf(key, startIdx); : str 문자열의 startIdx부터 처음으로 등장하는 key문자열을 찾는다. 찾았다면 일치하는 시작 인덱스를 반환한다. 찾지 못했다면 -1을 반환한다.
int startIdx = 0; // 시작점
while(true){
int findIdx = str.indexOf(key, startIdx);
if(findIdx < 0) // 찾지 못했다면
break;
result++; // 찾았다면 있으므로 개수 증가
startIdx = findIdx + key.length(); // 다음 위치(key이후)부터 탐색
}
System.out.println(result);
또 다른 방법: replace 함수 사용
원리는 str: aabaab , key: aa를 입력받았을때, key인 aa를 모두 지우면 bb만 남는다. str의 글자수는 6글자에서 2글자로 남는다. 즉, 4(사라진 글자의 수) / 2(key의 크기) = 2, 2번 나온다는 이야기다.
String replaced = str.replace(key, ""); // key와 같으면 ""으로 변환
result = (str.length() - replaced.length()) / key.length();
System.out.println(result);
replaced는 변환된 문자열이다.
'코딩가딩가' 카테고리의 다른 글
| [JAVA]BOJ 10158 (1) | 2024.01.16 |
|---|---|
| [JAVA]BOJ 13223 (0) | 2024.01.10 |
| [JAVA]BOJ 1157 (0) | 2024.01.02 |
| [JAVA]BOJ 1919 (0) | 2024.01.01 |
| [JAVA]BOJ 2744 (1) | 2023.12.31 |