<aside> 💬 lv1, 문자열 처리, 서브스트링

서브스트링의 위치 찾기

문제 설명

주어진 문자열과 서브스트링(substring)에 대해, 문자열 내에서 서브스트링이 나타나는 모든 시작 위치의 인덱스를 찾는 코드를 작성해주세요. 문자열과 서브스트링은 모두 소문자로만 구성되어 있으며, 문자열 내에서 서브스트링이 여러 번 나타날 수 있습니다. 예를 들어, 문자열 "this is a test string"에서 서브스트링 "is"의 위치는 [2, 5]입니다.


제한 사항


입출력 예

입력 (문자열, 서브스트링) 출력 (서브스트링 시작 위치의 인덱스 리스트)
("this is a test string", "is") [2, 5]
("repeat repeat repeat", "peat") [3, 10, 17]
("find the substring in the string", "the") [5, 24]

입출력 설명

문자열 내에서 주어진 서브스트링이 시작되는 모든 위치의 인덱스를 리스트로 반환합니다. 예를 들어, "repeat repeat repeat"에서 "peat"는 3번 나타나며, 각각의 시작 인덱스는 [3, 10, 17]입니다.

</aside>

풀이 1. replace 함수 활용

def solution(data):
    string, sub = data **#1 변수 설정 및 데이터 처리 준비**
    ret = []
    s = string.replace(sub, "0"+sub[1:]) **#2 문자열 처리**
    for i in range(len(s)): **#3 for 문으로 순회 후 결과 처리**
        if s[i] == "0":
            ret.append(i)
    return ret **#4 최종**

단계별 풀이 전략

  1. 변수 설정 및 데이터 처리 준비

    데이터 형태가 탐색할 문자열과 sub 문자열이라서 string, sub = data stringsub 로 분리해줍니다. ret = [] 반환할 결과 값을 저장할 문자열 변수 입니다.

  2. 문자열 처리

    string 문자열에서 sub 를 찾고, sub 문자열의 첫 번째 문자를 0 으로 바꿔주는 작업을 합니다.

  3. for 문으로 순회 후 결과 처리

    for i in range(len(s)) 문자열 s 의 길이만큼 순회하면서 if s[i] == "0"문자열 s 의 문자가 0 인 경우의 인덱스 i 를 결과를 반환할 리스트 ret 에 넣어줍니다.

  4. 최종

    인덱스가 모두 더해진 리스트 ret 을 반환합니다.

알아 둬야 할 개념

replace 함수

문제를 푸는 일은 다양한 아이디어를 떠올릴 수 있는 재밌는 작업입니다. replace 함수를 사용해 체크하기 좋은 문자로 변경해두고, 그 값의 자리를 인덱스로 받는 풀이도 좋은 아이디어 입니다.

풀이 2. find 함수의 활용

def solution(data):
    string, target = data #1 변수 설정 및 데이터 처리 준비
    start = 0
    result = []
    while True: 
        start = string.find(target, start) #2 start 인덱스 찾기

        if start == -1: #3 부분 문자열을 찾지 못했다면
            break

        result.append(start) #4 찾은 부분 문자열 처리
        start += 1
    return result #5 최종

단계별 풀이 전략

  1. 변수 설정 및 데이터 처리 준비

    string 변수에는 검색 대상 문자열이, target 변수에는 찾고자 하는 부분 문자열이 할당됩니다. start 변수는 검색 시작 위치를 나타내는 인덱스입니다. 초기 값은 0입니다. result 리스트는 찾은 부분 문자열의 시작 인덱스를 저장할 리스트입니다.

  2. start 인덱스 찾기

    string.find(target, start)는 string에서 target을 start 인덱스부터 찾습니다. 찾은 부분 문자열의 시작 인덱스를 start 변수에 할당합니다.

  3. 부분 문자열을 찾지 못했다면

    부분 문자열을 찾지 못한 경우 start-1이 됩니다. start-1이면 더 이상 찾을 부분 문자열이 없다는 의미이므로 break를 사용하여 루프를 종료합니다.

  4. 찾은 부분 문자열 처리

    찾은 부분 문자열의 시작 인덱스 start를 result 리스트에 추가합니다. start1 증가시켜 다음 검색 시작 위치를 설정합니다.