Data house

[python] 부분문자열 - 역순 풀이, rindex( ), rfind( ) 본문

Computer Knowledge/코테 대비 오답노트

[python] 부분문자열 - 역순 풀이, rindex( ), rfind( )

l._.been 2023. 5. 19. 13:29
728x90

진짜 기본적인 자료구조 문제에 속하는 부분문자열..

예전에 배웠지만 익숙하게 써지질 않는다..ㅠㅠ

이번에도 문제에 나와서 다시 풀어봤는데 다른 사람들이 푼 정답은 간결하고 beautiful 했다.

나 자신 공부해야한다..

문제

https://school.programmers.co.kr/learn/courses/30/lessons/181872

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

  • 문자열 myStringrhk pat이 주어진다
  • myString의 부분 문자열 중 pat로 끝나는 가장 긴 부분 문자열을 찾아서 return 
나의 풀이
def solution(myString, pat):
    
    # pat이 myString 안에서 1개일 때
    if myString.count(pat) ==1:
        return myString[:myString.index(pat)+len(pat)]
    
    # Pat이 myString 안에서 2개 이상일 때
    else:
        idx = myString.index(pat)
        for i,n in enumerate(myString):
            if i >idx and n == pat[0] and pat == myString[i:i+len(pat)]:
                idx = i
        return myString[:idx+len(pat)]

pat이 myString에 몇개가 있는지 나눠서 접근했는데.. 

이렇게하면 코드 길이가 장황하고 시간복잡도도 O(n)으로 좋지 않은 듯하다

 

인상적인 풀이

1. rindex( ), rfind( ) 이용한 풀이

solution=lambda x,y:x[:x.rindex(y)+len(y)]

 

  • rindex()
    • 지정 문자열이 마지막 나타나는 위치를 반환
    • 지정 문자열이 없는 경우, Exception(= 에러 처리 코드) 반환 (rfind( )는 -1 반환)
    • 검색 범위 지정된 경우, start부터 end(포함x) 내에서 검색

************************** find와 index 차이 **********************************

find( ) : 지정 문자열 처음 위치 (없을 땐, -1 반환)

rfind( ) : 지정 문자열 끝 위치 (없을 땐, -1 반환)

 

index( ) : 지정 문자열 처음 위치 (없을 땐, Exception 반환)

rindex( ) : 지정 문자열 끝 위치 (없을 땐, Exception 반환)

******************************************************************************

 

2. 역순으로 풀기

def solution(myString, pat):
    return myString[:len(myString) - myString[::-1].index(pat[::-1])]

이 풀이가 가장 흔한 풀이같다