Algorithm

백준 1543번 <문서 검색>

seungh2 2021. 8. 10. 17:07

백준 알고리즘 1543번

https://www.acmicpc.net/problem/1543

 

1543번: 문서 검색

세준이는 영어로만 이루어진 어떤 문서를 검색하는 함수를 만들려고 한다. 이 함수는 어떤 단어가 총 몇 번 등장하는지 세려고 한다. 그러나, 세준이의 함수는 중복되어 세는 것은 빼고 세야 한

www.acmicpc.net


1543번

문서에 단어가 총 몇 번 등장하는지 카운트하여 횟수를 출력한다.

이때 단어가 중복되지 않게 카운트하여야 한다.

즉 ababacabc 가 문서이고 단어가 aba일 때,

맨 앞에 ababa를 보면 2번을 셀 수 있지만 a가 중복되기 때문에 1번으로 카운트한다.

 

입력으로 첫 줄에 문서 document가 주어지고 둘째 줄에 검색할 단어 search가 주어진다.

 

출력으로는 단어가 문서에 중복되지 않게 몇 번 등장하는지 출력한다.


문제 해결

2가지 방법으로 풀었다.

처음 방법은 파이썬의 replace 함수를 이용하여 단어를 $로 바꾸어준 후 $의 개수를 세었다.

(replace 함수를 사용할 때는 

text = "asdf"
text = text.replace("a", "v")

이렇게 사용해야 함을 기억하자!!! text.replace()만 쓰면 바뀌지 않는다. )

 

import sys
input = sys.stdin.readline

document = input().rstrip()
search = input().rstrip()

document = document.replace(search, "$")

result = 0
for i in range(len(document)):
    if document[i] == "$":
        result += 1
print(result)

두 번째 방법은 replace()를 사용하지 않고 while 문을 이용하여 탐색하였다.

 

while 문으로 이용하여 document를 처음부터 본다. 이때 document의 부분을 보기 위해 dIdx를 사용하였다.

document의 길이 - dIdx가 len(search)보다 작으면 종료된다.

while 문 안에서는 if문으로 search와 document의 부분인 document[dIdx:dIdx+len(search)]를 비교하여 같으면 result에 1을 더해주고 dIdx에는 len(search)만큼 더해준다. document[dIdx:dIdx+len(search)]로 하면 dIdx 인덱스에서부터 len(search) 길이 만큼의 document의 부분을 얻을 수 있다. 이게 search와 같다는 것은 검색에 성공한 것으로 볼 수 있다.

만약 같지 않다면 dIdx에 1을 더하면 된다. (다음 인덱스로 나아가서 다시 비교를 해야 하니까)


코드

import sys
input = sys.stdin.readline

def check(document, search):
    dIdx = 0
    result = 0
    while(len(document)-dIdx >= len(search)):
        if document[dIdx:dIdx+len(search)] == search:
            result += 1
            dIdx += len(search)
        else:
            dIdx += 1
    return result

document = input().rstrip()
search = input().rstrip()
print(check(document, search))

결과


 

728x90