(구) 자료/SW Expert Academy

[SEA] 1213. [S/W 문제해결 기본] 3일차 - String

뜐뜐뜐 2017. 12. 27. 17:04

※ SW Expert 아카데미의 문제를 무단 복제하는 것을 금지합니다.

주어지는 영어 문장에서 특정한 문자열의 개수를 반환하는 프로그램을 작성하여라.

Starteatingwellwiththeseeighttipsforhealthyeating,whichcoverthebasicsofahealthydietandgoodnutrition.

위 문장에서 ti 를 검색하면, 답은 4이다.

[제약 사항]

총 10개의 테스트 케이스가 주어진다.

문장의 길이는 1000자를 넘어가지 않는다.

한 문장에서 검색하는 문자열의 길이는 최대 10을 넘지 않는다.

한 문장에서는 하나의 문자열만 검색한다. 

[입력]

각 테스트 케이스의 첫 줄에는 테스트 케이스의 번호가 주어지고 그 다음 줄에는 찾을 문자열, 그 다음 줄에는 검색할 문장이 주어진다.

[출력]

#부호와 함께 테스트 케이스의 번호를 출력하고, 공백 문자 후 테스트 케이스의 답을 출력한다.



[Checking This!]

- 이 문제에서는 String에서 indexOf가 얼마나 유용하게 쓰이는지 알 수 있었다.

- 과일가게 개발자님 블로그보고 다음과 같은 유용한 기능을 알 수 있었다. 표 출처는 [과일가게 개발자] 블로그



- 여기서 추가적으로, indexOf(String) 하면 단순히 String의 위치를 반환해주지만

- 이 문제는 해당 문자열이 몇 번이나 포함되었는지 알아야 하기 때문에, index를 옮겨가면서 찾아주어야 한다.

- indexOf(String, StartIndex)를 이용하면 가능하다.

- 이렇게 하면, 시작점을 기준으로 찾고자 하는 문자열의 위치를 반환해준다.

아 그리고, import 또한 실행시간에 영향을 크게 미치니까, 꼭 사용할 클래스만 넣어주는 습관을 들이자.


[How To Solve?]

- indexOf(String, StartIndex)를 활용한다.

- 문자열에서 가장 먼저 해당 문자열이 위치하는 인덱스를 찾아서 find에 넣어준다.

- 여기서, start에 find를 그대로 넣어주면 무한루프에 걸린다. index를 한 칸 옆으로 옮겨줘야한다.


[Code]


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
import java.io.*;
 
class Solution {
    public static void main(String args[]) throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
         
        for(int tc=1;tc<=10;tc++) {
            int N = Integer.parseInt(br.readLine());
            String find_this = br.readLine();
            String str = br.readLine();
             
            int start = 0;
            int Total = 0;
             
            while(start < str.length()) {
                int find = str.indexOf(find_this, start);
                if(find != -1) {
                    Total++;
                    start = find+1;
                }
                else break;
            }
            System.out.printf("#%d %d\n",tc,Total);
        }
    }
}
cs