프로그래머스 파이썬 기초 트레이닝 :: 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 에이블스쿨 : 대구광역시 공공데이터 활용 창업경진대회 준비

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

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