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

리스트 슬라이싱을 활용!
슬라이싱(slicing) or 슬라이스(slice):
연속적인 객체들에(예: 리스트, 튜플, 문자열) 범위를 지정해 선택해서 객체들을 가져오는 방법 및 표기법을 의미
슬라이싱을 하면 새로운 객체를 생성
-> 즉, 일부분을 복사해서 가져온다
a라는 연속적인 객체들의 자료구조(예: 리스트, 튜플, 문자열)가 있다고 가정을 했을 때 기본 형태
a[start : end : step]
각각 start, end, step 모두 양수와 음수를 가질 수 있다.
start: 슬라이싱을 시작할 시작위치
end: 슬라이싱을 끝낼 위치로 end는 포함하지 않음
step: stride(보폭)라고도 하며 몇개씩 끊어서 가져올지와 방향을 정함
옵션이며 아래의 예제를 확인하면 쉽게 이해가 가능합니다.
값들은 양수 혹은 음수를 가질 수 있다.
양수: 연속적인 객체들의 제일 앞에서부터 0을 시작으로 번호를 뒤쪽으로 증가
음수: 연속적인 객체들의 제일 뒤에서부터 -1을 시작으로 번호를 앞쪽으로 감소
a[ start : ]
a = ['a', 'b', 'c', 'd', 'e'] 일때
a[ 1 : ]
-> ['b', 'c', 'd', 'e']
a[ -3 : ]
->['c', 'd', 'e']
a[ : end ]
a = ['a', 'b', 'c', 'd', 'e'] 일때
a[ : 2 ]
-> ['a', 'b']
a[ : -1 ]
-> ['a', 'b', 'c', 'd']
a[ start : end ]
a = ['a', 'b', 'c', 'd', 'e'] 일때
a[ 2 : 4 ]
-> ['c', 'd']
a[ -4 : -2 ]
-> ['b', 'c']
❗인덱스 1 ~ 3까지의 값을 거꾸로 가져오기
a[ 3 : 0 : -1]
-> ['d', 'c', 'b']
a[ start : end : step ]
step이 양수일 때: 오른쪽으로 step만큼 이동하면서 가져옵니다.
step이 음수일 때: 왼쪽으로 step만큼 이동하면서 가져옵니다.
a = ['a', 'b', 'c', 'd', 'e']
1) 2칸씩 이동하며 가져오기
a[ : : 2 ]
-> ['a', 'c', 'e']
2) 3칸씩 이동하며 가져오기
a[ -5 : : 3 ]
-> ['a', 'd']
3) 전체를 거꾸로 가져오기
a[ : : -1 ]
-> ['e', 'd', 'c', 'b', 'a']
4) 응용
a[ 3 : : -1 ]
-> ['d', 'c', 'b', 'a']
인덱스 3인 원소부터 start, 거꾸로 전체 출력하기
이 문제는 주어진 문서에서 특정 단어를 찾는 문제로,
단어가 문서 내에서 겹치지 않고 연속적으로 등장하는 최대 횟수를 찾는 것이 목표입니다.
문제를 해결하기 위해서는 다음과 같은 방법을 사용할 수 있습니다
- 주어진 문서와 찾고자 하는 단어를 입력 받습니다.
- 문서에서 찾고자 하는 단어의 첫 번째 글자를 찾습니다.
- 만약 첫 번째 글자를 찾았다면, 그 위치부터 찾고자 하는 단어의 길이만큼을 비교합니다.
- 만약 비교한 단어가 찾고자 하는 단어와 일치한다면, 카운트를 증가시키고, 다음 비교를 위해 다음 위치로 이동합니다.
만약 일치하지 않는다면, 다음 위치로 이동합니다.
- 위의 과정을 반복하면서 최대 카운트 값을 구합니다.
이 방법을 사용하여 주어진 문서에서 특정 단어를 찾아 최대 횟수를 계산할 수 있습니다.
예를 들어,
문서가 "ababababa"이고
찾고자 하는 단어가 "aba"라면,
첫 번째 글자인 'a'를 찾은 후, "aba"와 "aba"를 비교하여 일치하므로 카운트를 1 증가시킵니다.
그리고 다음 위치로 이동하여 다시 "aba"와 "aba"를 비교하면 일치하므로 카운트를 1 증가시킵니다.
이렇게 총 3번 일치하므로 최대 횟수는 3이 됩니다.
이와 같은 방법으로 주어진 문제를 해결할 수 있습니다.
document = input() # 문서를 입력 받습니다.
word = input() # 찾고자 하는 단어를 입력 받습니다.
count = 0 # 최대 횟수를 저장할 변수를 초기화합니다.
index = 0 # 문서 내에서 현재 위치를 나타내는 변수를 초기화합니다.
while index <= len(document) - len(word): # 현재 위치가 문서의 범위 내에 있는 동안 반복합니다.
if document[index:index + len(word)] == word: # 현재 위치부터 찾고자 하는 단어의 길이만큼을 비교하여 일치하는지 확인합니다.
count += 1 # 일치하면 카운트를 증가시킵니다.
index += len(word) # 다음 비교를 위해 현재 위치를 찾고자 하는 단어의 길이만큼 이동시킵니다.
else:
index += 1 # 일치하지 않으면 다음 위치로 이동합니다.
print(count) # 최대 횟수를 출력합니다.
✅ document[index:index + len(word)]
문서에서 현재 위치(index)부터 찾고자 하는 단어의 길이(len(word))만큼을 슬라이싱한 부분을 나타냅니다.
예를 들어, 문서가 "ababababa"이고 찾고자 하는 단어가 "aba"라고 가정
첫 번째 반복에서 index가 0일 때
document[0:0 + len("aba")]는 "aba"가 되며,
이 부분과 찾고자 하는 단어 "aba"가 일치하므로 조건문이 참이 됩니다.
그러면 count 변수를 증가시키고, 다음 위치로 이동합니다.