민규의 흔적

[Python 파이썬] SWEA 1215번 - [S/W 문제해결 기본] 3일차 - String 본문

SWEA

[Python 파이썬] SWEA 1215번 - [S/W 문제해결 기본] 3일차 - String

민규링 2024. 5. 14. 17:14

2024년 5월 14일

문제 링크 : [Python 파이썬] SWEA 1215번 - [S/W 문제해결 기본] 3일차

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com

 


 

문제 접근

 

전형적인 패턴매칭 알고리즘 문제이다.

전체 문자열 S가 주어지고 부분 문자열 P가 주어졌을 때, S 안에 P가 몇 개 존재하는지 알아내면 되는 문제이다.

 

문자열 S의 맨 앞에서부터 문자를 하나씩 선택하며, 해당 문자를 시작으로 P의 길이만큼 슬라이싱하여 이 것이 패턴 P와 같은지 확인하기엔 너무 불필요한 연산이 많아진다.

 

그래서 나는 S의 각 문자가 P의 첫 번째 글자와 같은지 확인 후 같다면 해당 문자부터 P 길이만큼 슬라이싱하여 P와 대조해보는 방식을 택했다.

 

 


 

순서도

 

1. 전체 문자열 S와 패턴 P를 입력 받는다.

2. S의 맨 앞에서부터 문자를 하나씩 탐색하며 P의 첫 문자와 같은지 확인한다.
2-1. 만약 같다면 S의 해당 문자에서부터 P의 길이만큼 슬라이싱하여 P와 대조한다.
2-2. 대조하여 같다면 개수를 1 증가시킨다.

3. 총 개수를 출력한다.

 


 

입력 예제

 

1
ti
Starteatingwellwiththeseeighttipsforhealthyeating,whichcoverthebasicsofahealthydietandgoodnutrition

 


 

출력 예제

 

#1 4

 


 

전체 코드

 

def solution():
    p_len = len(p)
    s_len = len(s)
    
    cnt = 0

    for i in range(s_len - p_len + 1):
        if s[i] == p[0]:
            compair = s[i: i + p_len]
            if compair == p:
                cnt += 1
    

    return cnt

T = 10

for _ in range(1, T + 1):
    test_case = int(input())
    p = input()
    s = input()

    print(f'#{test_case} {solution()}')