[Python][백준 1543] 문서검색 & 슬라이싱(slicing) 예제

서윤·2023년 7월 4일

백준

목록 보기
18/23
post-thumbnail

문제

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']

💻 step 예제

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, 거꾸로 전체 출력하기

문제 풀이

이 문제는 주어진 문서에서 특정 단어를 찾는 문제로,

단어가 문서 내에서 겹치지 않고 연속적으로 등장하는 최대 횟수를 찾는 것이 목표입니다.

문제를 해결하기 위해서는 다음과 같은 방법을 사용할 수 있습니다

  1. 주어진 문서와 찾고자 하는 단어를 입력 받습니다.
  1. 문서에서 찾고자 하는 단어의 첫 번째 글자를 찾습니다.
  1. 만약 첫 번째 글자를 찾았다면, 그 위치부터 찾고자 하는 단어의 길이만큼을 비교합니다.
  1. 만약 비교한 단어가 찾고자 하는 단어와 일치한다면, 카운트를 증가시키고, 다음 비교를 위해 다음 위치로 이동합니다.
    만약 일치하지 않는다면, 다음 위치로 이동합니다.
  1. 위의 과정을 반복하면서 최대 카운트 값을 구합니다.

이 방법을 사용하여 주어진 문서에서 특정 단어를 찾아 최대 횟수를 계산할 수 있습니다.

예를 들어,

문서가 "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 변수를 증가시키고, 다음 위치로 이동합니다.

profile
UXUI Designer

0개의 댓글