문자열 비교 응용 - 다시 처음부터 되돌아가면서 비교해야할때
728x90
1. 문제
5555번: 반지
당신은 N개의 반지를 가지고 있다. 각각의 반지는 대문자 10 문자로 이루어진 문자열이 새겨져 있다. 반지는 문자열의 시작과 끝이 연결된 형태로 문자가 새겨져 있다. 반지에 각인된 문자열을
www.acmicpc.net
2. 풀이
보통 target 문자열 찾을때는 한줄 안에서 똑같이 있는지 찾았지만
이 문제는 target 문자열이 뒤로 넘어가면 다시 처음부터 되돌아가야한다
ZAAAAAAAXY에서 XYZ를 찾고자 할때,
Z XY
하면 하나를 찾을 수 있다는 뜻
어떻게 할 수 있을까
찾고자 하는 문자열 XYZ의 길이가 3이고 처음부터 끝까지 순회하는데...
ZAAAAAAAXY
XYZ에 도달하면 끝인데.. 여기서 YZ는 다시 처음 2글자 ZA와 비교해야하니까..
ZAAAAAAAXY 뒤에 (찾고자하는 문자열 길이-1)만큼의 문자열을 새로 붙여서
ZAAAAAAAXYZA로 만들고, 처음부터 원래 문자열 길이까지 브루트포스로 순회해서 비교해준다
from sys import stdin
target = stdin.readline().rstrip()
n = int(stdin.readline())
t = len(target)
count = 0
for _ in range(n):
string = stdin.readline().rstrip()
s = len(string)
#처음으로 되돌리기 위해,
#원래 문자열에서 비교하고자하는 문자열 길이만큼 붙여준다
string += string[:t]
find = False
#처음부터 원래 문자열의 길이만큼 순회해준다
for i in range(s):
if target == string[i:i+t]:
count += 1
break
print(count)
728x90
'알고리즘 > 문자열 알고리즘' 카테고리의 다른 글
manacher 응용문제로 이해력 높이기 - 회문인 부분문자열의 개수를 찾는법 (0) | 2023.05.04 |
---|---|
manacher algorithm 기본 개념 익혀보기1 (0) | 2023.05.01 |
컴퓨터로 미분하는 방법(문자열 파싱에서 항상 실수하는 부분 복기) (0) | 2023.04.11 |
10진수로 바꾸지 않고 2진수, 8진수 서로 변환하기 (0) | 2023.03.26 |
Trie 기본문제로 감잡아보기 -전화번호 목록, 게임 닉네임- (0) | 2023.01.25 |
TAGS.