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

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

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