프로그래머스 파이썬 기초 트레이닝 :: 첫 번째로 나오는 음수 (next, filter 활용)




              


    문제 설명 

    프로그래머스 URL

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



    프로그래머스 코딩 카테고리 

    코딩 기초 트레이닝

    Day 12 리스트(배열) - 첫 번째로 나오는 음수

    Lv.0



    문제 내용 

    정수 리스트 num_list가 주어질 때, 첫 번째로 나오는 음수의 인덱스를 return하도록 solution 함수를 완성해주세요. 음수가 없다면 -1을 return합니다.


    num_list                         result

    [12, 4, 15, 46, 38, -2, 15]             5

    [13, 22, 53, 24, 15, 6]             -1







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



    기본 코드   

    1. range(len(num_list))로 범위 설정한 방식 
    def solution(num_list):
        for i in range(len(num_list)):
            if num_list[i] < 0 :
                return i
        return -1



    2. enumerate() 로 범위 설정한 방식

    def solution(num_list):
        for i, v in enumerate(num_list) : 
            if v < 0 : 
                return i
        return -1




    한줄 코드 - 리스트 컴프리헨션

    1. range(len(num_list))로 범위 설정한 방식  
    def solution(num_list):
        return ([i for i in range(len(num_list)) if num_list[i] < 0] or [-1])[0]


    2. enumerate() 로 범위 설정한 방식 

    def solution(num_list):
        return ([i for i, v in enumerate(num_list) if v < 0] or [-1])[0]


    리스트 컴프리헨션 방식으로 한줄 코드를 썼을때,

    "끝에 [0]을 붙여서, 첫번째로 찾은 값은 리턴하겠다"를 뜻한다.

    "만약에 찾는 값이 없다면, 리스트가 [-1]"이 되서 첫번째 인덱스인 -1이 리턴된다.  

    끝에 [0]을 붙이지않으면, 결과값이 [5] 혹은 [-1] 처럼 리스트형으로 출력이된다. 




    이 문제처럼 iterable (리스트, 튜플, 문자열 등)에서 원하는 첫번째 값만 검색하고자 할때는 next 함수를 사용할 수 있다. 

    next (iterable, default) 함수 

    1. iterable (필수) : 

    2. default (선택) : 반복 가능 객체의 마지막 요소 이후 반환할 기본값. 

        next(my_string, len(my_string) 이렇게 쓴다면 

        "my_string 문자열을 다 순환한 이후에도 값이 없으면, 문자열의 길이를 반환" 


    1. range(len(num_list))로 범위 설정한 방식 
    def solution(num_list):
        return next((i for i in range(len(num_list)) if num_list[i] < 0 ), -1)


    2. enumerate() 로 범위 설정한 방식 
    def solution(num_list):
        return next((i for i, v in enumerate(num_list) if v < 0), -1)


    iterable 객체가 가지고 있는 __next__ 메서드를 활용한 함수이다.

    리스트를 for문 돌렸을때, 순차적으로 다음, 다음,,,, 끝까지 도는것 또한 __next__메서드를 통해 그렇게 동작하는 것이다. 

    그래서 next 함수는 iterable 객체에서 다음 값을 가져오는 역할을 한다. 

    조건을 만족하는 첫 번째 값을 찾는 용도로 활용된다. 

    1개의 값을 찾으면 바로 리턴하고, 찾고자하는 값이 없으면 에러가 발생한다. 

    이 에러를 방지하기 위해서, 두번째 매개변수인 default 값을 넣어야한다. (선택이지만 필수)


    조건에 만족하는 하나의 값을 삽입이나, 삭제, 수정할 때는 next 함수는 적절하지 못하다.

    조건에 맞는 첫 번째 값을 찾는 검색에 가까운 역할을 수행한다. 


    next 함수 장점은 효율적으로 반복을 수행한다는 것이다.  

    이 문제에서 next 함수를 쓰면 첫 번째 음수를 찾을 때까지만 반복을 수행한다.

    만약 일반적인 for문을 사용한다면 모든 원소를 확인한 후에야 결과를 알 수 있으므로 불필요한 반복이 발생할 수도 있지만,  

    next 함수를 써서 값을 중간에 찾으면 즉시 종료되기 때문에 성능 상 이점있음



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




    filter (function, iterable) 함수  

    if문 대신, filter 함수로 실행을 하고 리스트로 저장 
    def solution(num_list):
        answer = -1
        a = list(filter(lambda x : x<0 , num_list))
        if(len(a)>0):
            answer = num_list.index(a[0])
        return answer


    if문 대신, filter 함수를 써서 코드를 써도된다. 

    filter를 쓰면 리턴 값이 iterator 이기 때문에 list 형변환을 해줘야한다. 



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



    filter 추가 문제 

    [문제설명] 

    문자열 myString이 주어집니다. 

    "x"를 기준으로 해당 문자열을 잘라내 배열을 만든 후 

    사전순으로 정렬한 배열을 return 하는 solution 함수를 완성해 주세요.


    filter를 쓰지 않은 코드 
    def solution(myString):
        answer = []
        my = sorted(myString.split('x'))
        for i in my : 
            if i :
                answer.append(i)
        return answer 


    위 코드의 압축버전  
    def solution(myString):
        return [i for i in sorted(myString.split('x')) if i ]


    압축버전을 보면, if i로 i가 참일때만 리스트에 저장하는 것을 볼 수 있다. 

    if문을 쓰지 않고, filter를 사용해서 i가 참일때만 저장하는걸로 바꿀 수 있다. 

    def solution(myString):    
        return sorted(filter(lambda i : i !="", myString.split('x')))










    댓글

    이 블로그의 인기 게시물

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

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

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