알고리즘 연습/구현, 문자열

[🥈2 / 백준 5555 / 파이썬] 반지

김세진 2024. 4. 12. 03:28
반응형

 

 

 

 

 

5555번: 반지

당신은 N개의 반지를 가지고 있다. 각각의 반지는 대문자 10 문자로 이루어진 문자열이 새겨져 있다. 반지는 문자열의 시작과 끝이 연결된 형태로 문자가 새겨져 있다. 반지에 각인된 문자열을

www.acmicpc.net

 

문제

당신은 N개의 반지를 가지고 있다. 각각의 반지는 대문자 10 문자로 이루어진 문자열이 새겨져 있다. 반지는 문자열의 시작과 끝이 연결된 형태로 문자가 새겨져 있다. 반지에 각인된 문자열을 거꾸로 읽는 걱정은 없다.

찾고자하는 문자열이 주어졌을 때 그 문자열을 포함하는 반지가 몇 개인지를 발견하는 프로그램을 작성하라.

 

입력

입력은 총 2 + N 줄 이다.

첫 번째 줄에는 1 자 이상 10 자 이하의 대문자로 구성된 찾고자 하는 문자열이 적혀있다.

두 번째 줄에는 반지의 개수 N (1 ≦ N ≦ 100)이 적혀있다.

2+i 줄(1 ≦ i ≦ N)엔 i개의 반지에 새겨져있고, 10 문자로 이루어진 문자열이 적혀있다.

 

출력

찾고자하는 문자열을 포함 반지의 개수를 나타내는 정수를 한 줄로 출력하라.

 

예제 입력 1

ABCD
3
ABCDXXXXXX
YYYYABCDXX
DCBAZZZZZZ

예제 출력 1

2




예제 입력 2

XYZ
1
ZAAAAAAAXY

예제 출력 2

1


예제 입력 3

PQR
3
PQRAAAAPQR
BBPQRBBBBB
CCCCCCCCCC

예제 출력 3

2




 

 

힌트

<예제 입력 2>의 반지에는 "XYZ"라는 문자열이 하나 포함되어있다. 이것은 반지의 문자열의 시작과 끝이 연결되어 있기 때문이다.

<예제 입력 3>의 첫 번째 반지는 "PQR"이라는 단어가 2 개 포함되어 있으며, 두 번째 반지는 "PQR"라는 문자열이 1 개 포함되어 있으며, 세 번째 반지에는 "PQR"라는 문자열이 포함되어 있지 않다. 따라서 "PQR"라는 문자열이 포함되어있는 반지의 수는 2 개가 된다.

 

 

풀이

 

반지에서 문자열을 탐색할 때, 반지는 원형으로 끝과 끝이 이어져 있기 때문에 예제 2와 같은 경우가 있을 수 있다.

따라서 반지의 끝 문자를 떼서 다른 한 쪽에 붙이는 식으로 한 바퀴를 돌리며 처음 입력받은 문자열이 존재하는지 확인하는 방식으로 찾아야 한다.

 

s = input().rstrip()
ans = 0
for _ in range(int(input())):
    ring = input()
    
    for i in range(len(ring)):
        ring = ring[1:] + ring[0]
        if ring.find(s) >= 0:
            ans += 1
            break
print(ans)

 

 

 

 

반응형