프로그래머스 파이썬 기초 트레이닝 :: index, find 문제 모음 (str.rfind)

      







    문제들 

    Day-11 (5) 가까운 1 찾기




    문제 이해

    리스트나 문자열에서 원하는 값을 찾기 위해서, index 메서드를 사용할 수 있다.



    index 메서드 

    list.index(value, start, stop)

    str.index(value, start, stop)

    문자열이랑 리스트에서 사용 가능하고, 값을 이용해 인덱스를 추출하는 메서드

    최초로 찾는 값, 딱 하나를 반환한다. 




    ------------------------------------------------



    Day-11 (5) 가까운 1 찾기




    코드 1 

    내가 처음에 푼 방식 : 새로운 리스트에 index 저장

    def solution(arr, idx):
        tmp = []
        for i, val in enumerate(arr[idx:]) : 
            if val == 1 : 
                tmp.append(i+idx) 
        if len(tmp) :
            return min(tmp)
        else : 
            return -1 

    arr[idx: ]로 시작 인덱스를 슬라이싱한 뒤, 새로운 리스트인 tmp에 인덱스를 (i+idx) 로 저장했다. 

    그 뒤에, min 함수를 써서 최솟값 인덱스 추출


    위의 코드를 줄이면, 아래와 같음

    def solution(arr, idx):
        tmp = [i+idx for i, val in enumerate(arr[idx:]) if val == 1] 
        return min(tmp) if len(tmp) else -1 




    코드 2 

    list.index(value, start, stop) 메서드 쓰기 

    def solution(arr, idx):
        try : 
            return arr.index(1, idx)
        except : 
            return -1 

    리스트에서 index 메서드를 쓸때, 해당 값이 없으면 오류가 발생하기 때문에 try - except 구문을 써야한다

    index 메서드로 반환되는 값은 최소로 찾은 인덱스를 반환하고, 없으면 오류 발생시킴

    이 문제에서는 원하는 인덱스를 처음부터 찾는게 아니라, idx 값 이후부터 찾는 것이기 때문에 index 메서드의 두번째 매개변수(start)를 써야한다. 


    이 문제에서는 try - except 을 쓰지않고, if문 + in 연산자로도 가능 ↓

    def solution(arr, idx):    
        if 1 in arr[idx:] :
            return arr.index(1, idx)
        else : 
            return -1 




    ------------------------------------------------



    Day-12 (4) 2의 영역


    이 문제는 2가 등장하는 가장 왼쪽 인덱스 ~ 가장 오른쪽 인덱스를 찾는 문제이다. 

    문자열에서는 오른쪽 인덱스를 구하는 메서드가 있지만, 리스트에는 없다.  

    오른쪽 인덱스를 구하는 메서드 없이, 푸는 방법이 여러개가 있어서 정리해봄. 

    특히, 코드 2번은 잘 기억해두자. 




    코드 1

    내가 푼 방법 : 인덱스 넣는 리스트 만듬 
    def solution(arr):
        tmp = []
        for i, v in enumerate(arr) :
            if v == 2 : 
                tmp.append(i)
        if tmp : 
            return arr[min(tmp):max(tmp)+1]
        else : 
            return [-1]



    코드 2 

    list.index(value) 활용하기 ! 오른쪽 인덱스 찾는방법   

    def solution(arr):
        if 2 not in arr:
            return [-1]
        return arr[arr.index(2) : len(arr) - arr[::-1].index(2)]  # 오른쪽 index 찾는법 주의 


    가장 왼쪽 인덱스는 arr.index(2)로 찾으면 되고, 

    가장 오른쪽 인덱스는 arr를 역순으로 해서 인덱스를 찾아야한다. 

    arr[::-1].index(2) 이렇게 하면, 역순으로 몇번째 인덱스인지 알아내는거라서 전체 리스트 길이를 빼줘야한다. 


    오른쪽의 인덱스를 구하기 위해서, arr[::-1].index(2)만 하고 전체 리스트길이를 빼주지 않으면 아래처럼 값이 틀리게 나온다. 





    코드 3 

    신박한 방법 : pop으로 양쪽 필요 없는 부분 삭제     

    def solution(arr):
        while arr and arr[-1] != 2: arr.pop()
        arr = arr[::-1]
        while arr and arr[-1] != 2: arr.pop()
    
        return arr[::-1] or [-1] 



    코드 4 

    신박한 방법 : 검사

    def solution(arr):
        check, start , end = False, len(arr), 0
        for idx, num in enumerate(arr) :
            if num == 2:
                check = True
                start = min(start, idx)
                end = max(end, idx)
        if not check :
            return [-1]
        else :
            return arr[start:end+1]




    ------------------------------------------------


     


    Day-13 (3) 왼쪽 오른쪽




    코드 1

    인덱스 안쓰고 푸는 방법 
    def solution(str_list):
        for i in range(len(str_list)) : 
            if str_list[i] == 'l' :
                return str_list[:i]
            elif str_list[i] == 'r' :
                return str_list[i+1:]
        return []



    코드 2 

    list.index(value) + in / not in 연산자 활용  

    def solution(str_list):
        if 'l' not in str_list and 'r' not in str_list : #주의. ('l' and 'r') not in 안됨 
            return []
        
        if 'l' in str_list :
            l = str_list.index('l')
        else : 
            l = len(str_list)
    
        if 'r' in str_list :
            r = str_list.index('r')
        else : 
            r = len(str_list)
            
        if l < r :
            return str_list[:l]
        
        elif l > r :
            return str_list[r+1:] 


    'l' 이랑(and) 'r' 를 안 가지는지(not in) 동시에 체크할려고 

    ('l' and 'r' ) not in str_list 를 했지만, 오류가 남.

    같이 체크는 안되고, if 'l' not in str_list and 'r' not in str_list  이렇게 나눠서 체크해야함



    압축 버전 

    def solution(str_list):
        if 'l' not in str_list and 'r' not in str_list : return []
        
        l = str_list.index('l') if 'l' in str_list else len(str_list)
        r = str_list.index('r') if 'r' in str_list else len(str_list)
        
        return (str_list[:l] if l < r else str_list[r+1:] if l > r else [] ) 






    ------------------------------------------------


    Day-17 (1) 특정 문자열로 끝나는 가장 긴 부분





    코드 1

    내가 푼 방법 : find 사용하기  

    def solution(myString, pat):
        i = myString[::-1].find(pat[::-1])
        idx = (i) * -1 
        return myString[:idx] if idx < 0 else myString[:]

    index 메서드는 찾고자 하는 값이 없을때 오류를 반환하지만, 문자열에서만 사용할 수 있는 find 메서드는 값이 없을때 -1을 반환한다. 


    처음에 이 문제를 풀때는 rfind / rindex 메서드를 몰라서 최대한 find 메서드를 활용해서 문제를 풀었다. 


    코드 2

    rfind 사용하기  

    def solution(myString, pat):
        return myString[:myString.rfind(pat)] + pat 

    문자열을 출력할때, 두가지방법으로 표현할 수 있다.

    [:myString.rfind(pat)] + pat   또는  [:myString.rfind(pat)+len(pat)]


    def solution(myString, pat):
        return myString[:myString.rfind(pat)+len(pat) ] 




    코드 3

    lambda 

    solution = lambda myString, pat : myString[:myString.rfind(pat)]+ pat


    solution = lambda myString, pat : myString[:myString.rfind(pat)+len(pat)]








    댓글

    이 블로그의 인기 게시물

    [KT 에이블스쿨 - IT 트랜드] 국내외 AI 관련 규제

    KT 에이블스쿨 : IT 인프라 (1일차~5일차) 공부 정리

    KT 에이블스쿨 : 핀테크 아이디어 공모전